ABAP中的JSON反序列化

2020-09-12 03:12发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


尊敬的SAP社区

我希望您能帮助我在SAP中进行JSON反序列化。 我收到一个JSON字符串,并希望将其转换为内部表。 在下面,您可以看到一个有效的示例,但它的行为不像普通的JSON反序列化。

这些是问题:

  • 如果JSON字符串中的字段顺序不正确(只需在JSON输入文件中切换" FirstField"和" SecondField"),则转换将转储。 通常,无论字段顺序如何,JSON反序列化都应找到匹配项。
  • 如何声明真实的布尔值? 在我的示例中,布尔值仅作为带配额("")的字符串工作。
  • 要对此进行测试,您必须创建以下报告和以下转换。

    这是报告:

     *&---------------------------------------------  ------------------------ *
     *&报告ZJSON_SEQUENCE
     *&------------------------------------------------  --------------------- *
     报告zjson_sequence。
    
     参数:p_file类型字符串是必需的。
    
     类gcl_json定义。
       公共部分。
         类方法主要。
     结束类。
    
     类gcl_json实现。
       方法主。
         类型:lty_data的开头,
                  firstfield类型c的长度为10,
                  第二字段类型boole_d,
                lty_data的末尾。
    
         数据:lt_string类型的字符串表,
               lty_data的lt_data类型表,
               lv_string类型字符串。
    
         调用函数'GUI_UPLOAD'
           出口
             文件名= p_file
           桌子
             data_tab = lt_string
           例外情况
             其他= 1。
         如果sy-subrc <> 0。
           消息ID sy-msgid类型sy-msgty号
                      sy-msgno和sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4。
         万一。
    
         在lt_string处循环以分配field-symbol()。
           将lv_string 连接到lv_string。
         结束循环。
    
         调用转换zjson_sequence源xml lv_string
                                                结果根= lt_data。
    
         循环到lt_data分配字段符号()。
           写入:"第一字段=",-第一字段,
                  '; 第二个字段=',-第二个字段。
           跳跃。
         结束循环。
       方法。
     结束类。
    
     在p_file值请求的选择屏幕上。
       调用函数" WS_FILENAME_GET"
         输入
           文件名= p_file
         例外情况
           其他= 1。
    
     选择开始。
       gcl_json => main()。
     

    这是转换:

     <?sap.transform简单吗?>
     
       
       
       <对象>
         
           
             <对象>
               
     
     
               
     
      
            
           
         
       
       
     
     

    这是有效的JSON示例。 需要将其保存为文本文件并由报告上传:

     {
      "一些数据":
      [
       {
        " FirstField":" ABCDE12345",
        " SecondField":" true"
       }
      ]
     }
     

    这是JSON示例,无效:

     {
      "一些数据":
      [
       {
        " SecondField":是的,
        " FirstField":" ABCDE12345"
       }
      ]
     }
     

    期待您的指导。

    亲切问候
    马克·安德烈

             点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

    加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


    尊敬的SAP社区

    我希望您能帮助我在SAP中进行JSON反序列化。 我收到一个JSON字符串,并希望将其转换为内部表。 在下面,您可以看到一个有效的示例,但它的行为不像普通的JSON反序列化。

    这些是问题:

  • 如果JSON字符串中的字段顺序不正确(只需在JSON输入文件中切换" FirstField"和" SecondField"),则转换将转储。 通常,无论字段顺序如何,JSON反序列化都应找到匹配项。
  • 如何声明真实的布尔值? 在我的示例中,布尔值仅作为带配额("")的字符串工作。
  • 要对此进行测试,您必须创建以下报告和以下转换。

    这是报告:

     *&---------------------------------------------  ------------------------ *
     *&报告ZJSON_SEQUENCE
     *&------------------------------------------------  --------------------- *
     报告zjson_sequence。
    
     参数:p_file类型字符串是必需的。
    
     类gcl_json定义。
       公共部分。
         类方法主要。
     结束类。
    
     类gcl_json实现。
       方法主。
         类型:lty_data的开头,
                  firstfield类型c的长度为10,
                  第二字段类型boole_d,
                lty_data的末尾。
    
         数据:lt_string类型的字符串表,
               lty_data的lt_data类型表,
               lv_string类型字符串。
    
         调用函数'GUI_UPLOAD'
           出口
             文件名= p_file
           桌子
             data_tab = lt_string
           例外情况
             其他= 1。
         如果sy-subrc <> 0。
           消息ID sy-msgid类型sy-msgty号
                      sy-msgno和sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4。
         万一。
    
         在lt_string处循环以分配field-symbol()。
           将lv_string 连接到lv_string。
         结束循环。
    
         调用转换zjson_sequence源xml lv_string
                                                结果根= lt_data。
    
         循环到lt_data分配字段符号()。
           写入:"第一字段=",-第一字段,
                  '; 第二个字段=',-第二个字段。
           跳跃。
         结束循环。
       方法。
     结束类。
    
     在p_file值请求的选择屏幕上。
       调用函数" WS_FILENAME_GET"
         输入
           文件名= p_file
         例外情况
           其他= 1。
    
     选择开始。
       gcl_json => main()。
     

    这是转换:

     <?sap.transform简单吗?>
     
       
       
       <对象>
         
           
             <对象>
               
     
     
               
     
      
            
           
         
       
       
     
     

    这是有效的JSON示例。 需要将其保存为文本文件并由报告上传:

     {
      "一些数据":
      [
       {
        " FirstField":" ABCDE12345",
        " SecondField":" true"
       }
      ]
     }
     

    这是JSON示例,无效:

     {
      "一些数据":
      [
       {
        " SecondField":是的,
        " FirstField":" ABCDE12345"
       }
      ]
     }
     

    期待您的指导。

    亲切问候
    马克·安德烈

    付费偷看设置
    发送
    6条回答
    槿木_熙
    1楼 · 2020-09-12 03:55.采纳回答

    为什么不使用运行良好的东西。

    例如以下示例:

    https://wiki.scn.sap.com/wiki/display/Snippets/One+more+ABAP+to+JSON+Serializer + and + Deserializer

    https://blogs.sap.com/2013/02/21/three-different-ways-to-serialize-and-deserialize-complex-abap-data/

    我认为布尔值的问题可能已经解决,但不能确定,因为前一段时间我使用了它(第一个链接)。

    派大星 ヾ
    2楼-- · 2020-09-12 04:00

    我想避免这种情况, 可以使用来检查名称,以防万一字段名称是固定的...

    hongfeng1314
    3楼-- · 2020-09-12 03:49

    当您使用CALL TRANSFORMATION并且输入字符串为JSON时,它将自动将其转换为XML,并且 然后应用转换。 因此,您的问题是关于如何在简单转换中以任何顺序允许元素-> cf

    Violet凡
    4楼-- · 2020-09-12 03:54

    我没有使用/UI2/CL_JSON,因为您提到的第二个博客中有一个 更新使用此类是旧技术。

    但是,当我替换这些行时...

    调用转换zjson_sequence源xml lv_string
                                        结果根= lt_data。

    ...在我的上述报告中,与此有关:

    /ui2/cl_json =>反序列化(导出json = lv_string
                                          pretty_name =/ui2/cl_json => pretty_mode-camel_case
                                 更改数据= lt_data)。

    然后它仍然不起作用,因为lt_data在执行后为空。

    土豆飞人
    5楼-- · 2020-09-12 03:47

    您将在此处找到一些JSON解析想法: https://blogs.sap.com/2017/08/03/parsing-json-in- abap /

    亦是此间程序员
    6楼-- · 2020-09-12 03:55

    MarkAndréKluck tt:cond就是这个问题 你得到什么垃圾堆? 如果您的转换过于复杂,请使用类进行反序列化。

    一周热门 更多>