net.sf.json真的是个坑。
不建议使用,换成 阿里的JSON包——fastjson,还有谷歌的GSON等等要好很多
用net.sf.json真的是一件痛苦的事。。。。。
特别一个最不能接受的bug:在JSON对象转换Java List对象时,列表元素的List<*>会出现转换错误
Failed to instantiate [java.util.List]: Specified class is an interface
相当于多层list就转换不了,查了很多还是解决不了。后面发现用了 fastjson 的json 工具就轻松搞定,舍弃net.sf.json真的是明智之举。
用 fastjson 转换例子如下:
json数据
{
"msg": "success",
"xmlns": "",
"code": "000000",
"data": [
{
"person": {
"person": [
{
"id": 200,
"name": "person200"
},
{
"id": 201,
"name": "person201"
}
]
},
},
{
"person": {
"person": [
{
"id": 203,
"name": "person203"
},
{
"id": 204,
"name": "person204"
}
]
},
}
]
}
数据结构是:WebMessage包含list 的data,data里面又有list的person
转换代码如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
/**
*
* @param T person 对象
* @param jsonData 这是个json字符串
* @param <T>
* @return
*/
protected <T> Object getDate(Class<T> T, String jsonData) {
JSONObject jsonObject = JSON.parseObject(jsonData);
JSONObject webMessageJSON = jsonObject.getJSONObject("WebMessage");
WebMessage webMessage = JSON.parseObject(webMessageJSON.toJSONString(), WebMessage.class);
if (webMessage.getData() instanceof JSONArray) {
System.out.println("data 是列表");
JSONArray dataJSONs = (JSONArray) webMessage.getData();
List<T> ts = JSON.parseObject(dataJSONs.toJSONString(), new TypeReference<List<T>>() {});
List<T> results = new ArrayList<>();
for (T t:ts){
JSONObject dataJSON = (JSONObject) t;
results.add(JSON.parseObject(dataJSON.toJSONString(), T));
}
return results;
} else if(webMessage.getData() instanceof JSONObject) {
System.out.println("data 是对象");
JSONObject dataJSON = (JSONObject) webMessage.getData();
T result = JSON.parseObject(dataJSON.toJSONString(), T);
return result;
}
return null;
}