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