SAP中ABAP格式与JSON格式互转方法研究_SAP剑客的博客-程序员资料

技术标签: 程序人生 ABAPer  

一、JSON概念
JSON(JavaScript Object Notation) 是一种轻量级的 数据交换 格式。

JSON数据格式示例:
  1. {
  2.     "学生": [
  3.         {"姓名":"小明","年龄":23},
  4.         {"姓名":"大憨","年龄":24}
  5.     ]
  6. }
复制代码

一个对象以“{”(左括号)开始,“}”(右括号)结束
一个数组以“[”(左中括号)开始,“]”(右中括号)结束

二、JSON与XML
XML数据格式:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <country>
  3.     <province>
  4.         <name>黑龙江</name>
  5.         <cities>
  6.             <city>哈尔滨</city>
  7.             <city>大庆</city>
  8.         </cities>
  9.     </province>
  10.     <province>
  11.         <name>广东</name>
  12.         <cities>
  13.             <city>广州</city>
  14.             <city>深圳</city>
  15.             <city>珠海</city>
  16.         </cities>
  17.     </province>
  18. </country>
复制代码

编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读。
JSON难阅读,试试: JSON在线编辑器
JSON没有多余的标签,所以JSON比xml网络传输效率更高。

三、JSON与 ABAP 格式互转
1、cl_trex_json_serializer、cl_trex_json_deserializer方式
  1. DATA: lo_json_ser TYPE REF TO cl_trex_json_serializer,
  2.       lo_json_des TYPE REF TO cl_trex_json_deserializer.
  3. DATA: json_string TYPE string.

  4. DATA:BEGIN OF lt_spfli OCCURS 0,
  5.         carrid    TYPE spfli-carrid,
  6.         connid    TYPE spfli-connid,
  7.         cityfrom  TYPE spfli-cityfrom,
  8.         countryto TYPE spfli-countryto,
  9.      END OF lt_spfli.

  10. START-OF-SELECTION.

  11.   SELECT
  12.     carrid
  13.     connid
  14.     cityfrom
  15.     countryto
  16.   UP TO 10 ROWS
  17.   INTO TABLE lt_spfli
  18.   FROM spfli.


  19. *内表->JSON
  20.   CREATE OBJECT lo_json_ser
  21.     EXPORTING
  22.       data = lt_spfli[].
  23.   CALL METHOD lo_json_ser->serialize.
  24.   CALL METHOD lo_json_ser->get_data
  25.     RECEIVING
  26.       rval = json_string.

  27.   WRITE:json_string.
  28.   CLEAR:lt_spfli[].
  29. *JSON->内表
  30.   CREATE OBJECT lo_json_des.
  31.   CALL METHOD lo_json_des->deserialize
  32.     EXPORTING
  33.       json = json_string
  34.     IMPORTING
  35.       abap = lt_spfli[].
复制代码

 
该种转换方式,生成的JSON,KEY关键字没有引号,字符串中包含空格,如果与第三方系统做接口时,就会因为JSON格式问题,导致接口失败。

2、CALL TRANSFORMATION id 方式
  1. DATA:BEGIN OF lt_spfli OCCURS 0,
  2.         carrid    TYPE spfli-carrid,
  3.         connid    TYPE spfli-connid,
  4.         cityfrom  TYPE spfli-cityfrom,
  5.         countryto TYPE spfli-countryto,
  6.      END OF lt_spfli.
  7. DATA: lo_writer          TYPE REF TO cl_sxml_string_writer,
  8.       lv_output_length   TYPE i,
  9.       lt_binary_tab      TYPE STANDARD TABLE OF sdokcntbin,
  10.       lv_jsonx           TYPE xstring,
  11.       lv_json            TYPE string.

  12. SELECT  carrid
  13.         connid
  14.         cityfrom
  15.         countryto
  16. UP TO 10 ROWS
  17. INTO TABLE lt_spfli
  18. FROM spfli.

  19. * ABAP to JSON
  20. lo_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
  21. CALL TRANSFORMATION id SOURCE text = lt_spfli[] RESULT XML lo_writer.
  22. lv_jsonx = lo_writer->get_output( ).

  23. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  24.   EXPORTING
  25.     buffer        = lv_jsonx
  26.   IMPORTING
  27.     output_length = lv_output_length
  28.   TABLES
  29.     binary_tab    = lt_binary_tab.

  30. CALL FUNCTION 'SCMS_BINARY_TO_STRING'
  31.   EXPORTING
  32.     input_length  = lv_output_length
  33.   IMPORTING
  34.     text_buffer   = lv_json
  35.     output_length = lv_output_length
  36.   TABLES
  37.     binary_tab    = lt_binary_tab.

  38. * JSON to ABAP
  39. CALL TRANSFORMATION id SOURCE XML lv_jsonx RESULT text = lt_spfli.
复制代码

 
该种JSON转换生成的数据,比内表数据多了一部分“TEXT”字符串,也不是很满意

3、/UI2/CL_JSON方式
  1. DATA: lt_flight TYPE STANDARD TABLE OF sflight,
  2.       lrf_descr TYPE REF TO cl_abap_typedescr,
  3.       lv_json   TYPE string.

  4. SELECT * FROM sflight INTO TABLE lt_flight.

  5. * serialize table lt_flight into JSON, skipping initial fields and converting ABAP field names into camelCase
  6. lv_json = /ui2/cl_json=>serialize( data = lt_flight compress = abap_true pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
  7. WRITE / lv_json.

  8. CLEAR lt_flight.

  9. * deserialize JSON string json into internal table lt_flight doing camelCase to ABAP like field name mapping
  10. /ui2/cl_json=>deserialize( EXPORTING json = lv_json pretty_name = /ui2/cl_json=>pretty_mode-camel_case CHANGING data = lt_flight ).

  11. * serialize ABAP object into JSON string
  12. lrf_descr = cl_abap_typedescr=>describe_by_data( lt_flight ).
  13. lv_json = /ui2/cl_json=>serialize( lrf_descr ).
  14. WRITE / lv_json.
复制代码

/UI2/CL_JSON方式转换生成的JSON格式就完美了,他不仅支持结构、内表转换成JSON,还支持嵌套结构deep structure这种复杂的结构,了解更多请参考:
https://wiki.scn.sap.com/wiki/display/Snippets/One+more+ABAP+to+JSON+Serializer+and+Deserializer

注意:ABAP中定义变量是不区分大小写,而JAVA中变量是区分大小写的,所以需要对字符串替换一下,如下:
  1. REPLACE ALL OCCURRENCES OF 'contactname' IN post_string WITH 'contactName'.
复制代码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhongguomao/article/details/77594500

智能推荐

CodeBlock 下 配置 多线程!_code tr谩i blox_奔跑的Q的博客-程序员资料

对与CodeBlock下加入pthread 总是出现报错的情况的详细的解法!

pm2详解_starky0729的博客-程序员资料

对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本。关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对node网络应用有自建负载均衡功能。官方的说法,pm2&nbsp;是一个带有负载均衡功能的Node应用的进程管理器,个人认为,并不准确,因为pm2支持多种语言,只是对于除node之外的其他进程无负载均衡的能力。一,pm2特点:说一些pm2有哪些优点好处呢?支持进程行为配置...

关于ClearScript一些调试总结_成长的香蕉的博客-程序员资料

ClearScript是一个库,可以轻松地将脚本添加到.NET应用程序中。它目前支持JavaScript(通过V8和JScript)和VBScript.主机可以直接调用脚本函数和访问脚本对象。完全支持脚本调试。本次使用C#来提供接口来调用js代码 , 首先安装clearScriptV8,在NuGet安装包中可以找到,在代码中引用以下命名空间using Microsoft.Clea...

pm2基本使用_不知名架构师的博客-程序员资料

全面讲解node管理器pm2的基本使用

【web前端黑客技术揭秘】学习笔记-Part1_ZhShy23的博客-程序员资料

1.1 数据与指令1.1.1 SQL注入攻击的发生select username,email,desc from users where id=1;如果用户访问连接http://www.xxx.com/user.php?id=1来获取自身的账号信息。当访问这样的链接时,后端会执行上面这条SQL语句,并返回对应的id的用户信息到前端页面上。如果提交1 union select passwor...

FFmpeg学习(11)——视频转码之-crf参数详解_ffmpeg crf_秦岭熊猫的博客-程序员资料

什么是固定码率因子crf?(Constant Rate Factor)固定码率因子(CRF)是x264和x265编码器的默认质量(和码率控制)设置。取值范围是 0 到 51,这其中越低的值,结果质量越好,同时输出文件越大,越高的值意味着越高的压缩比,但你可能会在值大到某个点的时候注意到明显的质量损失。对 x264,一般取值在 18 到 28 之间。默认值是 23,你可以先用它开始尝...

随便推点

requests库下,python爬虫后将数据存入到MySQL中_如何把爬虫数据存入sql_西门大盗的博客-程序员资料

单纯使用request库进行爬虫,将数据存入MySQL的方法如下第一步:从Navicat进入创建数据库(articles),数据表(info)第二步:定义函数import pymysqldef save_to_mysql(data): try: conn = pymysql.connect(host='localhost', port=3306, user='root', ...

用ffmpeg将各种视频文件转成F4V格式_ffmpeg生成f4v_geaglem的博客-程序员资料

       F4V格式是一种用H264编码的FLV格式,现在的FFmpeg是不支持直接将各种视频文件转为F4V格式的。但有种十分隐秘 鲜为人所知的方法可以实现我们的要求。       代码:ffmpeg.exe -i example.avi -acodec libfaac -ac 2 -ab 16k -vcodec libx264 -coder 1 -g 250 -keyint_min 25 -sc_threshold 40 -bf 3 -b_strategy 1 -partitions +parti8x

【嵌入式】---- 串口UART波形分析_usart波形分析_伊 娃的博客-程序员资料

串口参数的配置波特率(bit/s):9600或115200。停止位:1位停止位;也可以是0.5,1.5或2位。数据位:8位数据位;也可5,6,7位。奇偶校验:无奇偶校验。影响串口波形的参数主要是:起始位+数据位+停止位起始位: 1个低电平起始位。不能设置,一定有数据位: 8位。LSB(低位在前)eg:发送0X43,他的二进制数是0100 0011,串口波形显示的就是1100 0...

常用指令linux总结_weixin_30335575的博客-程序员资料

linux的基础操作命令: 常见命令:man查看帮助文档用法:man +命令help查看指定命令的用法用法:命令 --help(有空格)tablinux下命令与文件名补全用法:在打出不熟悉的命令或要输入名字过长的文件名时,可以输入开头几个命令的开头,按键盘TAB键,补全命令whereis查看命令的出处,包含指定命令人的文...

数字电路设计总结(一):组合逻辑和同步时序设计_数电实验同步时序电路_电磁场与无线技术的博客-程序员资料

进入大三下学期了,备战考研的同时也打算整理拓展所学的技能,到时候无论是通过考研初试接着参加复试还是考研失利找工作都能排得上用场。数字电路这一块最近见识到了UCSD(加州大学)的国际一流水准的课程,深受震惊,所以打算从这里开始,但这个教程还是属于提纲性的,不会把用到的每个东西都解释清楚,但我会告诉大家需要哪些知识。本系列打算开如下几章:组合逻辑和同步时序设计异步时序电路设计 实战:十六人投票器(multisim仿真后自制电路)FSM(有限状态机)和HLSM(高级状态机)(上板实验)memory和他

7805和78l05可以代换吗_78L05和7805有什么区别_weixin_39851872的博客-程序员资料

主要区别是,性质不同、输入电压、输出电流不同、功能作用不同,具体如下:一、性质不同1、78L0578L05是一种固定电压(5V)三端集成稳压器,可适用于很多应用场合。其卓越的内部电流限制和热关断特性使之特别适用于过载的情况。2、78057805三端稳压集成电路,是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。它的样子像是普通的三极管,常见的三端稳压集成电路有正电压输出的7...