Чистый язык ABAP не имеет понятия нулевых значений, за исключением пустых ссылок . Наиболее подходящей «концепцией» является начальное значение .
Преобразование ID
, используемое для создания формата JSON, никогда не может создать значение JSON "null" из начального значения. Сериализация пустой ссылки дает {}
, а другие типы производят либо ""
(типы C, STRING, X, XSTRING, последние два выражаются в base64), "000..."
(тип N), "0000-00-00"
(тип D), "00:00:00"
(тип T) или 0
(типы I, P, F, DECFLOAT16, DECFLOAT34, INT1, INT2, INT8).
Чтобы сериализовать только не начальные значения, выможет использовать опцию initial_components = 'suppress'
из CALL TRANSFORMATION
:
CALL TRANSFORMATION ID
SOURCE result = ls_structure
RESULT XML lo_json_writer
OPTIONS initial_components = 'suppress'.
Следующая программа демонстрирует различия значений JSON, когда они являются начальными, а не начальными, и когда опция initial_components = 'suppress'
используется. Примечание: чтобы ссылка на данные была сериализована, мне пришлось использовать опцию "data_refs = 'heap-or-create'`.
- начальные значения:
{"RESULT":{"STRING":"","CHAR4":"","INT":0,"BINFLOAT":0,"DECFLOAT":0,"NUMC4":"0000","DATE":"0000-00-00","TIME":"00:00:00","XSTRING":"","HEX2":"","DREF":{},"OREF":{}}}
- initialзначения + опция
initial_components = 'suppress'
: {"RESULT":{}}
- не начальные значения:
{"RESULT":{"STRING":"a ","CHAR4":"b","INT":-1,"BINFLOAT":-2.9999999999999999E-1,"DECFLOAT":-0.3,"NUMC4":"0001","DATE":"2019-11-01","TIME":"10:49:00","XSTRING":"/w==","HEX2":"/w==","DREF":{"%ref":"#d1"},"OREF":{"%ref":"#o10"}},"%heap":{"o10":{"%type":"http://www.sap.com/abapxml/classes/program/ZDEMO_JSON_INITIAL:LCL_CLASS","%val":{"local.LCL_CLASS":{"ATTRIBUTE":"d"}}},"d1":{"%type":"abap:characters","%maxLength":1,"%val":"c"}}}
Программа:
REPORT zdemo_json_initial.
TYPES: BEGIN OF t_my_type,
string TYPE string,
char4 TYPE c LENGTH 4,
int TYPE i,
binfloat TYPE f,
decfloat TYPE decfloat16,
numc4 TYPE n LENGTH 4,
date TYPE d,
time TYPE t,
xstring TYPE xstring,
hex2 TYPE x LENGTH 2,
dref TYPE REF TO data,
oref TYPE REF TO object,
END OF t_my_type.
CLASS lcl_class DEFINITION.
PUBLIC SECTION.
INTERFACES if_serializable_object.
DATA attribute TYPE string.
ENDCLASS.
DATA(initial) = value t_my_type( ).
DATA(oref) = NEW lcl_class( ).
oref->attribute = 'd'.
DATA(non_initial) = VALUE t_my_type( string = `a ` char4 = `b ` int = -1 binfloat = '-0.3'
decfloat = '-0.3' numc4 = '1' date = '20191101' time = '104900'
xstring = 'FF' hex2 = 'FF' dref = REF #( 'c' ) oref = oref ).
DATA(lo_json_writer1) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
CALL TRANSFORMATION id SOURCE result = initial RESULT XML lo_json_writer1
OPTIONS data_refs = 'heap-or-create'.
DATA(json_initial) = lo_json_writer1->get_output( ).
DATA(lo_json_writer2) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
CALL TRANSFORMATION id SOURCE result = initial RESULT XML lo_json_writer2
OPTIONS data_refs = 'heap-or-create' INITIAL_COMPONENTS = 'suppress'.
DATA(json_initial_suppress) = lo_json_writer2->get_output( ).
DATA(lo_json_writer3) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
CALL TRANSFORMATION id SOURCE result = non_initial RESULT XML lo_json_writer3
OPTIONS data_refs = 'heap-or-create'.
DATA(json_non_initial) = lo_json_writer3->get_output( ).