2016-05-31 38 views
6

Mam anonimową tablicę, którą chcę deserializować. Tutaj przykład, wszystkie obiekty są takie same, ja tylko sformowałem pierwszy.Jak deserializować anonimową tablicę JSON w 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"} 
] 

Próbowałem deserializacji za pomocą CL_TREX_JSON_SERIALIZER ale że sprawa jest uszkodzony i nie działa z moim JSON (look at this question)

Potem próbowałem /UI2/CL_JSON. To coś potrzebuje "struktury", która idealnie pasuje do Obiektu podanego przez Obiekt JSON. "Struktura" oznacza w moim przypadku wewnętrzną tabelę obiektów z atrybutami time, date, timestamp, level, message i details. Wystąpił problem: ta klasa nie obsługuje poprawnie reffrences: używa opisu klas do opisu pola przypisanego do fieldymbola. Ponieważ nie mogę mieć listy obiektów, a jedynie listę reffrencji do obiektów, co zwykle nie stanowi problemu. To rozwiązanie nie działa.

W trzeciej próbie próbowałem z CALL TRANSFORMATION jak opisał Horst Keller, ale z tej metody nie byłem w stanie czytać w annonymous tablicy. (Jagger skomentował lepszy link do tej ABAP 2 JSON and JSON 2 ABAP with ST)

Moje główne punkty:

  • nie chcę zmienić JSON, ponieważ to, co dostaję od sap.ui.log
  • I preferują używać wbudowana funkcjonalność, a nie thirdparty ramach
+0

Czy próbowałeś [to] (https://scn.sap.com/community/abap/blog/2013/04/15/abap-2-json-and-json-2-abap-with-st) ? – Jagger

+0

@Jagger Tak, bazuje on na 'Transformacji wywołania', która wymaga (przez składnię' TRANSFORMACJA WYWOŁANIA demo_st_json_table ŹRÓDŁO XML json WYNIK '**' carrier = result.' **) nazwany węzeł główny (w tym przypadku 'operatorzy') Nie mam w mojej annonimowej tablicy. – inetphantom

+0

Czy zmiana json "w locie" jest do przyjęcia? Przeczytałbym ten json na sznurku (zakładając, że zawsze jest taki mały), a następnie przykleiłem "anonimowy": {'na początku i'} 'na końcu. Następnie spróbuj użyć "WYWOŁUJ CALL TRANSFORMATION", aby uzyskać wszystko, czego potrzebujesz, i jeśli to konieczne, usuń te sklejone części na wyjściu. – Jagger

Odpowiedz

0

Twój problem nie wychodzi z anonimowości tablicy, ale z niezręczności SAP JSON (DE) serializatora, który nie przestrzega cudzysłowów, które otaczają atrybuty JSON. Problem został dokładnie opisany in this answer.
Jeśli nie chcesz zmieniać swojego JSON-a w locie, jedynym sposobem jest zmiana CL_TREX_JSON_DESERIALIZER klasy like this.