2012-06-26 1 views
1

Если я хочу разработать сериализатор для языка, для которого он еще не существует (например, ABAP), какими могут быть его усилия? Включает ли это просто написание «текстового эквивалента» серийного блока ABAP - как бы я решал сложные объекты. Какая была бы лучшая отправная точка для этого?Написание JSON-сериализатора

+0

Всмотритесь в json.org. Убедитесь, что вы понимаете, что такое JSON ... и нет. –

ответ

2

Обновление: Начиная с Релизы 7,02 и 7,03/7,31 (ядро патч 116), JSON поддерживается изначально в ABAP - проверить this blog Хорста Келлера.

Сначала вы должны искать ABAP и JSON с помощью сайта: sap.com, а затем выбрать один из существующих проектов, чтобы узнать и внести свой вклад. Однако, если вы все еще не используете бонусные очки NIH, убедитесь, что знаете, как использовать общие типы, полевые символы, RTTI и рекурсию наизнанку, а затем рекурсивно переходить к сложной структуре данных с помощью RTTI. Как только вы это сделаете, легко собрать любую выходную строку.

+0

Возможно, вы захотите обновить этот ответ с помощью встроенной поддержки json. – tomdemuyt

1

Существует класс, который выполняет именно это: CL_TREX_JSON_SERIALIZER. Единственное, чего у него нет (и SAP сказал мне через сообщение клиента, что они не исправят его, они не поддерживают этот код) помещает атрибут в двойные кавычки.

Это легко исправить, добавив по линии 52 в CL_TREX_JSON_SERIALIZER-Recurse:

CONCATENATE '"' <abapcomp>-name '"' c_colon INTO l_value . 

Пример программы будет:

"We are going to serialize an error 
DATA: wa_error TYPE bapireturn. 
"Reference to the serializer 
DATA: cl_serializer TYPE REF TO zcl_trex_json_serializer. 
"Final output 
DATA: l_json_string TYPE string. 

wa_error-type = 'E'. 
wa_error-code = 'BC' . 
wa_error-message = 'This will serialize correctly.'. 

CREATE OBJECT cl_serializer 
    EXPORTING 
    DATA = wa_error. 

cl_serializer->serialize() . 
l_json_string = cl_serializer->get_data() . 
WRITE l_json_string. 

Я использую zcl_trex_json_serializer, который представляет собой клон cl_trex_json_serializer с beforementioned исправить. Этот код вернет:

{"type": "E", "code": "BC", "message": "Это будет сериализоваться правильно.", "Log_no": "", "log_msg_no": " 000000 "," message_v1 ":" "," message_v2 ":" "," message_v3 ":" "," message_v4 ":" "}

Я использовал этот код для структур, содержащих таблицы и т. Д .; код, похоже, способен справиться со всем этим.