码迷,mamicode.com
首页 > Web开发 > 详细

json-lib 的XML转JSON list的转换

时间:2015-04-23 23:33:39      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:json-lib   xml   

开发中越到一个坑爹问题,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,可能是个个例也可能帮到大家

json-lib 的XML转JSON list的转换

标签:json-lib   xml   

原文地址:http://blog.csdn.net/qjueyue/article/details/45228863

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!