READ TABLE WITH TABLE KEY не находит записи - PullRequest
3 голосов
/ 11 октября 2019

Я пытаюсь использовать класс /ui5/cl_json_parser для анализа строки JSON.

Следующий фрагмент кода воспроизводит проблему:

REPORT ztest_json_parse.

DATA: input TYPE string,
      output TYPE string,
      json_parser TYPE REF TO /ui5/cl_json_parser.


input = '{"address":[{"street":"Road","number":"545"},{"street":"Avenue","number":"15"}]}'.
CREATE OBJECT json_parser.

json_parser->parse( input ).
json_parser->print( ).

output = json_parser->value( path = '/address/1/street' ).

WRITE output.

Метод print показываетправильная проанализированная строка JSON, но переменная output всегда пуста.

Я проследил код до метода VALUE класса /UI5/CL_JSON_PARSER в строке 15, которая содержит:

read table m_entries into l_entry with table key parent = l_parent name = l_name.

В отладчике я вижу, что l_parent = '/address/1' и l_name = 'street', и что во внутренней таблице m_entries содержится запись с parent = '/address/1' и name = 'street'. Тем не менее оператор READ всегда возвращает sy-subrc = 4 и ничего не находит.

Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Первый: не использовать /ui5/cl_json_parser класс, он предназначен только для внутреннего использования и не имеет надежной документации

enter image description here

Во-вторых, вот пример того, как вы можете получить значение улицы из первого элемента вашего JSON:

DATA(o_json) = cl_abap_codepage=>convert_to( '{"address":[{"street":"Road","number":"545"},{"street":"Avenue","number":"15"}]' ).
DATA(o_reader) = cl_sxml_string_reader=>create( o_json ).

TRY.
    DATA(o_node) = o_reader->read_next_node( ).
    WHILE o_node IS BOUND.
      DATA(op) = CAST if_sxml_open_element( o_node ).
      LOOP AT op->get_attributes( ) ASSIGNING FIELD-SYMBOL(<a>).
        DATA(attr) = <a>->get_value( ).
      ENDLOOP.
       IF attr <> 'street'.
         o_node = o_reader->read_next_node( ).
       ELSE.
         DATA(val) = CAST if_sxml_value_node( o_reader->read_next_node( ) ).
         WRITE: '/address/1/street =>', val->get_value( ).
         EXIT.
       ENDIF.
    ENDWHILE.
  CATCH cx_root INTO DATA(e_txt).
ENDTRY.

Насколько я знаю, в ABAP нет класса, позволяющего извлекать отдельные атрибуты JSON, такие какXPath для XML.

0 голосов
/ 19 октября 2019

Конечно, согласен с Suncatcher в отношении парсера UI5 Json. Если вы не контролируете / не знаете структуру исходных данных, ответ Suncatchers будет хорошим.

Однако, если вы знаете базовую структуру исходного JSON и должны, если вы планируете получить доступ к первой строке адреса,Название поля ул. И вы можете предоставить источник, используя заглавные имена переменных, тогда вы можете использовать так называемое преобразование идентичности .

types: begin of ty_addr,
     street type string,
     number type string,
     end of ty_addr.
types ty_addr_t type STANDARD TABLE OF ty_addr.

 DATA: input TYPE string,
       ls_addr TYPE ty_addr,
       lt_addr type ty_addr_t.

input = '{"ADDRESS":[{"STREET":"Road","NUMBER":"545"},{"STREET":"Avenue","NUMBER":"15"}]}'.

CALL TRANSFORMATION id SOURCE XML input
                           RESULT address = lt_addr.

 read table lt_addr index 1 into ls_addr.
 WRITE ls_addr-street.
...