Я хотел бы десериализовать строку JSON в структуру, определенную следующим образом:
TYPES: BEGIN OF json_subobject,
c TYPE i,
d TYPE decfloat34,
END OF json_subobject.
TYPES: BEGIN OF json_object,
a TYPE c LENGTH 10,
b TYPE json_subobject,
END OF json_object.
DATA: foo TYPE json_object.
Я моделирую эту структуру в JSON следующим образом:
{
"a":"FooBar",
"b":{
"c":9,
"d":3.14
}
}
Сейчас Я написал простую программу для проверки оператора CALL TRANSFORMATION на приведенном выше JSON в сочетании с приведенными выше определениями структуры. Программа должна десериализовать JSON (жестко запрограммированный в переменной lv_xmls) и распечатать содержимое полученной структуры. Содержимое структуры должно соответствовать содержимому оригинала JSON. Это программа:
TYPES: BEGIN OF json_subobject,
c TYPE i,
d TYPE decfloat34,
END OF json_subobject.
TYPES: BEGIN OF json_object,
a TYPE c LENGTH 10,
b TYPE json_subobject,
END OF json_object.
DATA: foo TYPE json_object.
DATA: lv_xmls TYPE string VALUE '{"a":"FooBar","b":{"c":9,"d":3.14}}',
lv_xmlb TYPE xstring.
TRY.
lv_xmlb = cl_abap_codepage=>convert_to(
source = lv_xmls
codepage = `UTF-8`
endian = space
replacement = '#'
ignore_cerr = abap_false ).
CATCH cx_parameter_invalid_range cx_sy_codepage_converter_init cx_sy_conversion_codepage cx_parameter_invalid_type.
ENDTRY.
WRITE: |Deserializing JSON ...|.
NEW-LINE.
CALL TRANSFORMATION id SOURCE XML lv_xmlb RESULT XML = foo.
WRITE: '{'.
NEW-LINE.
WRITE: | "a": "{ foo-a }",|.
NEW-LINE.
WRITE: | "b": \{|.
NEW-LINE.
WRITE: | "c": { foo-b-c },|.
NEW-LINE.
WRITE: | "d": { foo-b-d },|.
NEW-LINE.
WRITE: | \}|.
NEW-LINE.
WRITE: |\}|.
Вывод, который я ожидал бы получить:
Deserializing JSON ...
{
"a":"FooBar",
"b":{
"c":9,
"d":3.14
}
}
Но, к сожалению, вывод, который я получаю:
Deserializing JSON ...
{
"a":"",
"b":{
"c":0,
"d":0
}
}
Это выглядит например, оператор CALL TRANSFORMATION ничего не делает для меня.
Есть ли гуру ABAP, который мог бы показать мне, как использовать CALL TRANSFORMATION в этом (надеемся) простом случае? Я уже осмотрелся и обнаружил это полезное репозиторий GitHub , демонстрирующий, как десериализовать JSON в класс, но я бы предпочел десериализовать JSON в структуру для простоты. Я не совсем уверен, как использовать CALL TRANSFORMATION, потому что я незнаком с XSLT и продвинутыми XML функциями, поэтому я был бы очень признателен за готовое решение, если это возможно ...
Большое спасибо заранее
Джошуа