1

我正在反序列化一个 JSON 文件,并试图找到处理布尔值的正确方法。我首先尝试将 JSON/XML 布尔值直接映射到本机 ABAP 元素,但这引发了异常。然后我尝试检查是否为真并映射特定值“X”(以各种方式),但这些都不起作用。寻找想法/建议。

我的示例程序

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,
             return TYPE xsdboolean,   "xsdboolean
             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.


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

    TRY.
        CALL TRANSFORMATION zst_order_test SOURCE XML lv_json RESULT root = lt_order.
      CATCH cx_transformation_error INTO DATA(exc).
        cl_demo_output=>display( exc->get_text( ) ).
        RETURN.
    ENDTRY.

  ENDMETHOD.

ENDCLASS.

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

我检查元素的值是否为“true”——如果是,我想为 ABAP_BOOLEAN 返回适当的值。我尝试了很多选择。在这个最新版本中,它引发了一个预期值“X”的异常。

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">
  <tt:root name="ROOT" type="?"/>
  <tt:variable name="RETURN"/>
  <tt:variable length="1" name="ABAP_TRUE" type="C" val="'X'"/>
  <tt:template>
    <object>
      <str name="order_id">
        <tt:value option="noError" ref="ROOT.order_id"/>
      </str>
      <array>
        <tt:loop ref="ROOT.items">
          <object>
            <str name="line">
              <tt:value ref="$ref.posnr"/>
            </str>
            <bool name="return">
<!--              <tt:read type="C" var="RETURN"/>-->
<!--              <tt:cond-var check="RETURN='true'">-->
                <tt:value option="noError" ref="$ref.return"/>
<!--              </tt:cond-var>-->
<!--              <tt:cond-var check="RETURN!='true'"/>-->
<!--              <tt:skip/>-->
            </bool>
            <tt:cond>
              <str name="order_reason">
                <tt:value option="noError" ref="$ref.reason"/>
              </str>
            </tt:cond>
            <tt:cond>
              <null name="order_reason">
                <tt:value option="noError" ref="$ref.reason"/>
              </null>
            </tt:cond>
          </object>
        </tt:loop>
      </array>
    </object>
  </tt:template>
</tt:transform>

我认为这应该很容易——但又卡住了:-)。感谢您提供任何输入建议。

4

1 回答 1

1

多亏了 Sandra 的提示,这个问题现在已经解决了。对于那些对此感兴趣的人来说是解决方案(关键点是使用 XSDBOOLAN - 我认为我已经尝试过,但显然没有与其他所有东西正确组合)。

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,
             return TYPE xsdboolean,
             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.


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

    TRY.
        CALL TRANSFORMATION zst_order_test SOURCE XML lv_json RESULT root = lt_order.
      CATCH cx_transformation_error INTO DATA(exc).
        cl_demo_output=>display( exc->get_text( ) ).
        RETURN.
    ENDTRY.

  ENDMETHOD.

ENDCLASS.

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

工作转型

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">
  <tt:root name="ROOT" type="?"/>
  <tt:template>
    <object>
      <str name="order_id">
        <tt:value option="noError" ref="ROOT.order_id"/>
      </str>
      <array>
        <tt:loop ref="ROOT.items">
          <object>
            <str name="line">
              <tt:value ref="$ref.posnr"/>
            </str>
            <bool name="return">
                <tt:value option="noError" ref="$ref.return"/>
            </bool>
            <tt:cond>
              <str name="order_reason">
                <tt:value option="noError" ref="$ref.reason"/>
              </str>
            </tt:cond>
            <tt:cond>
              <null name="order_reason">
                <tt:value option="noError" ref="$ref.reason"/>
              </null>
            </tt:cond>
          </object>
        </tt:loop>
      </array>
    </object>
  </tt:template>
</tt:transform>

就这么简单......一旦你知道如何

于 2021-03-01T15:22:33.087 回答