ABAP解析JSON中动态字段名的内容

原始JSON:

{
	"result": {
		"10005005": {
			"msg": "操作失败",
			"code": "-1"
		},
		"10005006": {
			"msg": "操作失败",
			"code": "-1"
		}
	},
	"code": "1"
}

需求是需要拿到订单编号‘10005005’及对应的msg和code的值,由于订单编号是动态的,所以常规的方式是不行的,但是可以借助系统标准工具类cl_abap_structdescr来协助完成。

解决demo如下:

*&---------------------------------------------------------------------*
*& Report ZTEST_GET_JSON
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_get_json.
TYPES:
  BEGIN OF ty_order_info,
    order TYPE char10,
    msg   TYPE string,
    code  TYPE char2,
  END OF ty_order_info,
  tt_order_info TYPE STANDARD TABLE OF ty_order_info.

DATA:
  lv_json       TYPE string,
  lr_data       TYPE REF TO data,
  lt_components TYPE abap_compdescr_tab.

DATA:
  lt_order_info TYPE tt_order_info,
  ls_order_info TYPE ty_order_info.

lv_json = `{"result":{"10005005":{"msg":"操作失败","code":"-1"},"10005006":{"msg":"操作失败","code":"-1"}},"code":"1"} `.

/ui2/cl_json=>deserialize(
  EXPORTING
    json         = lv_json
    pretty_name  = /ui2/cl_json=>pretty_mode-user
    assoc_arrays = abap_true
  CHANGING
    data         = lr_data ).

ASSIGN lr_data->* TO FIELD-SYMBOL(<fs_data>).

ASSIGN COMPONENT 'RESULT' OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<fs_items_ref>).

ASSIGN <fs_items_ref>->* TO FIELD-SYMBOL(<fs_items>).

PERFORM frm_get_comp USING <fs_items> CHANGING lt_components.

LOOP AT lt_components INTO DATA(ls_components).
  ASSIGN COMPONENT ls_components-name OF STRUCTURE <fs_items> TO FIELD-SYMBOL(<fs_order_info_ref>).
  ASSIGN <fs_order_info_ref>->* TO FIELD-SYMBOL(<fs_order_info>).

  ls_order_info-order = ls_components-name.

  ASSIGN COMPONENT 'MSG' OF STRUCTURE <fs_order_info> TO FIELD-SYMBOL(<fs_msg_ref>).
  ASSIGN <fs_msg_ref>->* TO FIELD-SYMBOL(<fs_msg>).

  ASSIGN COMPONENT 'CODE' OF STRUCTURE <fs_order_info> TO FIELD-SYMBOL(<fs_code_ref>).
  ASSIGN <fs_code_ref>->* TO FIELD-SYMBOL(<fs_code>).

  ls_order_info-msg  = <fs_msg>.
  ls_order_info-code = <fs_code>.

  APPEND ls_order_info TO lt_order_info.
  CLEAR ls_order_info.
ENDLOOP.

cl_demo_output=>display( lt_order_info ).

FORM frm_get_comp USING     us_data
                  CHANGING  ct_comp TYPE abap_compdescr_tab.
  DATA:
    lo_descr_ref TYPE REF TO cl_abap_typedescr,
    lo_struc     TYPE REF TO cl_abap_structdescr.

  CALL METHOD cl_abap_structdescr=>describe_by_data
    EXPORTING
      p_data      = us_data
    RECEIVING
      p_descr_ref = lo_descr_ref.

  lo_struc ?= lo_descr_ref.

  ct_comp = lo_struc->components.
ENDFORM.

解析效果:

 

以上。 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ABAP是一种高级编程语言,通常用于SAP系统的开发,它是面向对象的,可扩展的,具有跨平台的特性。而JSON是一种轻量级的数据交换格式,由于它具有易读性,易解析性以及广泛的支持,已经成为Web开发、移动开发等领域的数据传输标准。 对于在SAP系统使用JSON数据格式的情况,我们需要使用ABAPJSON解析器来将JSON数据转化为ABAP内部的数据结构。在ABAP,有两种常用的JSON解析方式: 1. JSON转换器(SAP内部类型) 这种方式是将JSON字符串转换成SAP内部类型的结构(例如table、structure、string、numeric值等),从而方便我们在ABAP程序进行后续的操作。 首先需要通过调用兼容JSON的结构描述语言的类,生成兼容JSON语法的文档类型,之后再根据需要的数据结构,利用WRITE_JSON_FILE函数生成JSON数据格式,最后再将JSON数据格式传入PARSE_JSON()函数解析。 利用JSON转换器的方式,我们可以通过简单的语句实现JSON数据与ABAP内部数据的转化,但是由于其复杂的使用方式,这种方法不太适合在大型的应用使用。 2. JSON解析器接口(SAP内置类) 另外一种解析JSON数据的方式是使用SAP内置的JSON解析器接口,这种方法比较容易理解和使用,也比较适合在大型的应用使用。 ABAP提供了CL_TREX_JSON_PARSER类,它可以处理所有JSON数据结构(例如object、array、value等)并将其转换成ABAP数据类型。利用该类,我们可以轻松地将JSON数据转换为ABAP内部数据结构,同时也能够轻松地将ABAP数据类型转换为JSON数据格式。 总而言之,无论是使用SAP内置的JSON转换器,还是直接在ABAP使用JSON解析器接口,都可以轻松地将JSON数据转换成ABAP内部数据结构,并进行各种操作或者通过HTTP或其他协议与外部系统进行数据交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值