Пользовательская сериализация нулевых / начальных значений в ABAP с использованием CALL TRANSFORMATION - PullRequest
4 голосов
/ 30 октября 2019

Вы можете сериализовать структуры ABAP в JSON с помощью команды CALL TRANSFORMATION. Есть ли возможность сериализации null значений для начальных полей или игнорирования начальных полей?

TYPES: BEGIN OF t_my_type,
         foo TYPE string,
         bar TYPE string,
       END OF t_my_type.

DATA ls_structure TYPE t_my_type.
ls_structure-foo = 'some value'.
ASSERT ls_structure-bar IS INITIAL.
DATA(lo_json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
CALL TRANSFORMATION id SOURCE result = ls_structure RESULT XML lo_json_writer.
DATA(lv_json_xstring) = lo_json_writer->get_output( ).
WRITE cl_abap_codepage=>convert_from( source = lv_json_xstring ).

Результат этого минимального рабочего примера:

{
  "RESULT": {
    "FOO": "some value",
    "BAR": ""
  }
}

На других языках (которыенеобходимо обработать json, экспортированный из SAP) пустые строки "" и null не совпадают и требуют дополнительной обработки / обработки, которых я хотел бы избежать. Я хочу получить такой результат

{
  "RESULT": {
    "FOO": "some value",
    "BAR": null
  }
}

или проигнорировать начальное значение, например:

{
  "RESULT": {
    "FOO": "some value"
  }
}

Могу ли я передать некоторые дополнительные правила CALL TRANSFORMATION о том, как обрабатывать null /начальные значения?

Ответы [ 2 ]

4 голосов
/ 30 октября 2019

Чистый язык 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'`.

Программа:

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( ).
0 голосов
/ 30 октября 2019

Если вы используете обновленную систему, вы можете использовать класс / ui2 / cl_json . В противном случае вы можете использовать библиотеку json.abap .

...