json-lib 的XML转JSON list的转换_希咚的故事的博客-程序员宅基地

技术标签: java  xml  json-lib  

开发中越到一个坑爹问题,webserver 返回的list是 一个和多个 json-lib 翻译的不同, 在java bean中 是list ,一个的化会变成Object 多个才会变成array 对前台造成了很大的困难
比如
< member_bankcard_querylist_response >
   < list >
     < bank_code >6222023202033815035</ bank_code >
     < status >未审核</ status >
   </ list >
   < success >true</ success >
   < sign >8B9EEE0911F8CDC965D025911691E779</ sign >
</ member_bankcard_querylist_response >


翻译的是
{"member_bankcard_querylist_response": {
  "list":   {
    "bank_code": "6222023202033815035",
    "status": "未审核"
  },
  "success": "true",
  "sign": "8B9EEE0911F8CDC965D025911691E779"
}}


但是
< member_bankcard_querylist_response >
   < list >
     < bank_code >6222023202033815035</ bank_code >
     < status >未审核</ status >
   </ list >
    < list >
     < bank_code >6222023202033815035</ bank_code >
     < status >未审核</ status >
   </ list >
   < success >true</ success >
   < sign >8B9EEE0911F8CDC965D025911691E779</ sign >
</ member_bankcard_querylist_response >
转移之后就是
{"member_bankcard_querylist_response": {
  "list":   [
        {
      "bank_code": "6222023202033815035",
      "status": "未审核"
    },
        {
      "bank_code": "6222023202033815035",
      "status": "未审核"
    }
  ],
  "success": "true",
  "sign": "8B9EEE0911F8CDC965D025911691E779"
}}

想要的是都是数组,因为对于别人开发不可能进行修改.这个折磨了很久,尝试了各种办法,最后只能修改json-lib的源码来进行处理
json-lib 是根据 xml attribute的值来判断的 比如 class="array" 就处理成array class="String" 就处理成string
我们自定义了一个 class="list"
在XMLSerializer 修改处理函数
if  (clazz.compareToIgnoreCase(JSONTypes.LIST) ==  0 ) {
                 if  (!jsonObject.has(key)) {
                     jsonObject.element(key,
                             new  JSONArray()
                                     .element(simplifyValue(
                                             jsonObject,
                                             processObjectElement(element,
                                                     defaultType))));
                     ((JSONArray) jsonObject.get(key)).setExpandElements( true );
                     classProcessed =  true ;
                 }
             }
判断如果是class="list" 哪怕是一个也强制转成 array

比如
< member_bankcard_querylist_response >
   < list class="list" >
     < bank_code >6222023202033815035</ bank_code >
     < status >未审核</ status >
   </ list >
   < success >true</ success >
   < sign >8B9EEE0911F8CDC965D025911691E779</ sign >
</ member_bankcard_querylist_response >


转换后
{"member_bankcard_querylist_response": {
  "list": [  {
    "bank_code": "6222023202033815035",
    "status": "未审核"
  }],
  "success": "true",
  "sign": "8B9EEE0911F8CDC965D025911691E779"
}}

在webserver中需要增加xml的描述
import  java.io.Serializable;
 
import  javax.xml.bind.annotation.XmlAttribute;
import  javax.xml.bind.annotation.XmlRootElement;
 
/**
  * 返回xml描述改对象为List ,在json-lib转义的时候发现list.size() == 1 的时候改回Array
  * @author JueYue
  * @date 2015年4月23日 下午4:39:48
  */
@XmlRootElement
public  class  XmlListBase  implements  Serializable {
 
     private  static  final  long  serialVersionUID = 1L;
 
     private  String            beanType         =  "list" ;
 
     @XmlAttribute (name =  "class" )
     public  String getBeanType() {
         return  beanType;
     }
 
     public  void  setBeanType(String beanType) {
         this .beanType = beanType;
     }
 
}


只要继承这个类就可以了,得到的xml 就会加上class的attribute,可能是个个例也可能帮到大家
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jueyue/article/details/45228863

智能推荐

Ajax无刷新(三)用户列表展示_baizaimen0393的博客-程序员宅基地

1 &lt;%--前端使用layer框架与bootstrap框架ajax无刷新 、模态框 2 Created by IntelliJ IDEA. 3 User: 冰与火之歌 4 Date: 2019/8/30 5 Time: 22:44 6 To change this template use File | Settings | ...

linux用nohup在后台常驻运行php脚本_CGraphX的博客-程序员宅基地_nohup php

在linux平台上,要在后台运行脚本的话,一般是在命令之后加上&即可。但是今天tong

【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?_congc.qiu的博客-程序员宅基地

本文为转自石杉的架构笔记(id:shishan100),十余年BAT架构经...

基于Vxworks实时操作系统的串口通信程序设计与实现_weixin_34025151的博客-程序员宅基地

摘要:结合嵌入式实时操作系统VxWorks实现风洞测控系统的实际应用,以其中的串口通信为例,讨论了在VxWorks下实现串口通信的关键技术,给出了基本原理、环境配置和程序示例。 关键词:VxWorks;实时操作系统;嵌入式操作系统;串行通信 [Abstract] Combining with the application of wind tunnel measure and cont...

Windows 下 Git 的中文支持_bill_20106029的博客-程序员宅基地_git 中文

Windows 下 Git 的中文支持由于 Windows 下使用各地区本地的编码方案,而 Linux 下统一使用更加国际化的 Unicode 编码,中文字符在不同编码混杂时往往面临窘境。想要在 Git 中使用中文也要作一些配置。

寻找遗失的Kernal32.dll—WinDbg&汇编—手动&动态_Zhouio的博客-程序员宅基地

如果你是因为标题进来的, 那么你一定在好奇, 好好的Kernal32.dll躺在我的C盘里面, 怎么会遗失呢,你一定没想到,在你打开这篇文章链接的瞬间,你的Kernal32.dll已经被我隐藏了,只有读完这篇文章,你才能找到破解的办法。哈哈,只是开个玩笑!我还没有厉害到这个程度。其实我这里给大家分享的是如何找到一个重要结构体, 并从这个结构体中获取有价值的数据。这个结构

随便推点

protobuf安装和嵌套定义_CTO技术的博客-程序员宅基地_protobuf嵌套

背景博主因为公司项目原因,客户端和服务端通信采用了protobuf协议,关于protobuf协议,不明白的自行百度,这个协议因其高效安全性,还是蛮常见的。博主也是第一次安装使用,定义协议文件时发现不知道如何嵌套定义结构了,摸索。安装建议直接参考git上的README下载https://github.com/google/protobuf,解压需要以下依赖工具autoconf auto...

PAT乙级——德才论(25)C++_baixiaofei567的博客-程序员宅基地

题目描述宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”现给出一批考生的德才分数,请根据司马光的理论给出录取排名。输入描述:输入第1行给出3个正整数,分别为:N(&lt;=105),即考生总数;L(&gt;=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格被考虑录取;H(&lt;100),为优先录取线——德分和才分均不低于此线的被定义为“才

“A Part-aware Surface Metric for Shape Analysis” Reading Note_jingwenlai的博客-程序员宅基地

 “A Part-aware Surface Metric for Shape Analysis” Reading NoteJingwenlai 2010-3-5 [REF] RongLiu, HaoZhang, Ariel Shamir etc. A Part-aware Surface Metric for Shape Analysis, EUROGRAPHICS 2009.V

六十星系之08太阳天梁坐卯酉_firejaysoft的博客-程序员宅基地_流年命宫太阳天梁在卯

08太阳天梁坐卯酉    阳梁卯宫称为[日照雷门],这有如黎明时分的太阳,光芒初露,这个宫位的太阳其光和热无法解除天梁星曜那种孤克刑忌的性质,因为阳光初露,前程虽然远大,但光和热都有限,故在此宫位立命的人必先经过艰难与险阻,然后才能在事业上有所成就。但本宫星曜仍然主贵而不主富,因此也就宜于从事公众服务行业,如果遇到文星宜从事学术研究,或担任教职。若命宫有禄存文昌同度,则是所谓的[阳梁昌禄]格。古诀

Dijkstra算法--图的最短路径_Enable1234___的博客-程序员宅基地

Dijkstra算法--图的最短路径一、源代码dijkstra_self.cpp/* * dijkstra_self.cpp * * Created on: 2017年4月1日 * Author: @yinaibang * * * *Dijkstra算法步骤: * *a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的