2016-05-31 3 views
6

У меня есть анонимный массив, который я хочу десериализовать. Здесь пример, все объекты одинаковы, я только сформировал первый.Как десериализировать анонимный массив JSON в abap?

[ 
    { "time":"08:55:54", 
    "date":"2016-05-27", 
    "timestamp":1464332154807, 
    "level":3, 
    "message":"registerResourcePath ('', '/sap/bc/ui5_ui5/ui2/ushell/resources/')", 
    "details":"","component":"sap.ui.ModuleSystem"}, 
    {"time":"08:55:54","date":"2016-05-27","timestamp":1464332154808,"level":3,"message":"URL prefixes set to:","details":"","component":"sap.ui.ModuleSystem"}, 
    {"time":"08:55:54","date":"2016-05-27","timestamp":1464332154808,"level":3,"message":" (default) : /sap/bc/ui5_ui5/ui2/ushell/resources/","details":"","component":"sap.ui.ModuleSystem"} 
] 

Я попытался десериализации с помощью CL_TREX_JSON_SERIALIZER но вещь повреждена и не работает с моей JSON (look at this question)

Затем я попытался /ui2/CL_JSON. Эта вещь нуждается в «структуре», которая идеально подходит для объекта, заданного объектом JSON. «Структура» означает в моем случае внутреннюю таблицу объектов с атрибутами time, date, timestamp, level, message и details. Возникла проблема: этот класс неправильно обрабатывает реферрации: он использует classdescription для описания поля, присвоенного знаку fields. Поскольку у меня не может быть списка объектов, но есть только список реферрантов для объектов, что обычно не представляет проблемы. Это решение не работает.

В третьей попытке я попытался с CALL TRANSFORMATION, как описано Horst Keller, но с помощью этого метода я не смог прочитать в annonymous массиве. (Джаггер прокомментировал лучшую связь этого ABAP 2 JSON and JSON 2 ABAP with ST)

Моих главных пунктов:

  • Я не хочу, чтобы изменить JSON, так это то, что я получаю от sap.ui.log
  • Я предпочитаю использовать встроенный в функциональности, а не третью сторону рамки
+0

Вы пробовали [это] (https://scn.sap.com/community/abap/blog/2013/04/15/abap-2-json-and-json-2-abap-with-st) ? – Jagger

+0

@Jagger Да, он основывается на 'Call transform', который нуждается (по синтаксису' CALL TRANSFORMATION demo_st_json_table SOURCE XML json RESULT' ** 'carrier = result.' **) именованный корневой узел (в данном случае' carrier') У меня нет моего анонимного массива. – inetphantom

+0

Будет ли изменение json «на лету» приемлемым? Я бы прочитал этот json в строке (при условии, что он всегда такой маленький), а затем склеить «анонимный»: {'в начале и'} 'в конце. Затем попробуйте использовать 'CALL TRANSFORMATION' для всего, что вам нужно, и поместите эти склеенные части на выход, если это необходимо вообще. – Jagger

ответ

0

Ваша проблема не выходит из анонимности массива, а из неловкости SAP JSON (De) сериализатором, который не уважает двойные кавычки, которые ограждают атрибуты JSON. Вопрос подробно описан in this answer.
Если вы не хотите менять свой JSON на лету, вы можете изменить только CL_TREX_JSON_DESERIALIZER класс like this.

Смежные вопросы