通过ST转换处理JSON反序列化中的空值?

通过ST转换处理JSON反序列化中的空值?,json,abap-st,Json,Abap St,JSON到ABAP有问题。这是一个高度简化的示例,但试图抓住要点。每个JSON元素(除了少数例外)都可以存在一个实值、一个空值或根本不存在 在本例中,有3个订单项。订单项目可能有也可能没有订单原因。对于第01行,它是ABC;对于第02行,它是null;对于第03行,它根本不存在 如果您查看XML,您会发现创建的元素因内容而异,我不知道如何在我的ST中处理。我猜这是某种条件、组或开关,但我似乎找不到正确的语法来检查元素有时是“null”还是有时是“string”。因此,它不是对元素内容的检查,而是

JSON到ABAP有问题。这是一个高度简化的示例,但试图抓住要点。每个JSON元素(除了少数例外)都可以存在一个实值、一个空值或根本不存在

在本例中,有3个订单项。订单项目可能有也可能没有订单原因。对于第01行,它是ABC;对于第02行,它是null;对于第03行,它根本不存在

如果您查看XML,您会发现创建的元素因内容而异,我不知道如何在我的ST中处理。我猜这是某种条件、组或开关,但我似乎找不到正确的语法来检查元素有时是“null”还是有时是“string”。因此,它不是对元素内容的检查,而是对实际元素本身的检查

超简单JSON

{
“订单id”:“564320”,
“项目”:[
{
“行”:“01”,
“订单原因”:“ABC”
},
{
“行”:“02”,
“订单原因”:空
},
{
“行”:“03”
}
]
}
然后将其隐式转换为XML以在ST Order中进行处理。Reason元素用于第一项,然后用于第二项,最后一行中缺少


564320
01
基础知识
01
03
这是我的例子圣


下面是一个可执行的ABAP来测试上述功能。有两个版本的JSON需要测试。第一个有效,因为每个项目都有一个原因码。检查此项,以确保一切正常。通过切换到代码中的第二个示例,您可以看到需要处理元素而不是元素。因此,不是元素的内容,而是预期的元素本身。我试图对元素进行存在性检查,但这似乎不起作用(或者实际上我不知道引用当前元素的类型/名称的语法)


结果证明这太简单了。我可能盯着它看得太久了,想象着一些过于复杂的解决方案,包括组、开关等等。也许这甚至是可能的,但这是可行的。刚刚添加了两个条件元素


请提供一个非常短的JSON、非常短的ST、非常短的ABAP代码。注意:最后,你要问的是,如果一个值可以是字符串或空值,如何在ST中编写替代代码,这是通过例如来完成的。用更简单的示例和一个可执行的ABAP程序更新了这个问题。谢谢桑德拉:-)
*&---------------------------------------------------------------------*
*& Report Z_JSON_ABAP
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_json_abap2.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.

    TYPES: BEGIN OF ty_s_line,
             posnr  TYPE posnr,
             reason TYPE char3,
           END OF ty_s_line.

    TYPES: BEGIN OF ty_s_header,
             order_id TYPE vbeln,
             items    TYPE TABLE OF ty_s_line WITH DEFAULT KEY,
           END OF ty_s_header.

    DATA: lt_order TYPE ty_s_header.

* Example 1 - Works - Easy!
    DATA(lv_json) = cl_abap_codepage=>convert_to(
   `{` &&
  ` "order_id": "51324", ` &&
  ` "items": [ ` &&
  ` { ` &&
  `   "line": "01", ` &&
  `   "order_reason": "ABC" ` &&
  `   }, ` &&
  `   { ` &&
  `   "line": "02", ` &&
  `   "order_reason": "DEF" ` &&
  `   }, ` &&
  `   { ` &&
  `   "line": "03", ` &&
  `   "order_reason": "123" ` &&
  `   } ` &&
  `  ] ` &&
  `  } `  ).


* Example 2 - Does not work! - Swap sections to test

*    DATA(lv_json) = cl_abap_codepage=>convert_to(
*   `{` &&
*  ` "order_id": "51324", ` &&
*  ` "items": [ ` &&
*  ` { ` &&
*  `   "line": "01", ` &&
*  `   "order_reason": "ABC" ` &&
*  `   }, ` &&
*  `   { ` &&
*  `   "line": "02", ` &&
*  `   "order_reason": null ` &&
*  `   }, ` &&
*  `   { ` &&
*  `   "line": "03" ` &&
*  `   } ` &&
*  `  ] ` &&
*  `  } `  ).

    CALL TRANSFORMATION zst_order_test SOURCE XML lv_json RESULT root = lt_order.

  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).