json-lib 的XML转JSON list的转换

开发中越到一个坑爹问题,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,可能是个个例也可能帮到大家
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值