现今接口的设计越来越多的使用json格式来传输数据,最大的优点就是不受语言的限制,配合rest风格的接口用起来很是方便.
但是在java中为了获取json 数据的方便往往会将拿到的json数据转为对象,这样用起来会更加方便.
用的com.alibaba.fastjson.JSONObject
String jsonString = "{"key": "value"}";
JSONObject jsonObject = JSONObject.parseObject(jsonString);
第一步先将 json字符串转为 json 对象.
然后就是使用 jsonObject.get(""),或jsonObject.getString("")等等,
这种虽然可以用 , 但是只适用于json比较简单少的情况, 如果复杂的json就不适用了
可以使用 T t = JSONObject.parseObject(“json字符串”, T.class);
先看一个json字符串示例 如下:
{
"ret": "0",
"msg": "返回成功",
"data": [
{
"xxx": [
{
"ffe": "200000",
"ye": "17375.84",
"zt": "还ww款",
"bh": "0220wwe0565",
"zh": "0024we19233"
}
],
"yyy": [
{
"dwc": "xxxx农e村x局",
"dwh": "02w22381we5",
"grh": "0024398219",
"grye": "17515.39",
"grzt": "封ew存"
},
{
"dwc": "xxx人sd民xx",
"dwz": "02d33xx2068",
"grh": "00xdxxd4667",
"grye": "0",
"grzt": "销户"
}
]
}
]
}
这是个json对象和json数组相互嵌套的,看起来比较复杂的json字符串.
下边来创建json所对应的java对象类.
但是怎么建呢,这里提供一个思路就是从最里层往外依次建立类.
所有类省略构造方法,get() set()方法
注意: 属性名要和json中对应.
public class Xxx {
private String ffe;
private String ye;
private String zt;
private String bh;
private String zh;
}
public class Yyy {
private String dwc;
private String dwh;
private String grh;
private String grye;
private String grzt;
}
public class Jb {
private List<Xxx> xxx;
private List<Yyy> yyy;
}
由于ret 和 msg 是每个接口通用的, 这里可以考虑写一个父类, 让不同的接口去继承
父类(通用部分)
public class CommonResponse {
// 响应代码
private String ret ;
// 描述
private String msg ;
}
子类: (注意属性名对应json中的data)
public class Jbbo extends CommonResponse {
private List data;
public Jbbo(){}
public Jbbo(String ret, String msg, List data) {
super(ret, msg);
this.data = data;
}
public List getData() {
return data;
}
public void setData(List data) {
this.data = data;
}
}
实体类已经建完了,终于可以使用了
Jbbo jbbo = JSONObject.parseObject("json字符串", Jbbo.class);
以上代码就会将json字符串根据属性对应到Jbbo对象中的各个属性.
@Test
public void test(){
Jbbo jbbo = JSONObject.parseObject(jsonString, Jbbo.class);
System.out.println(jbbo);
}
打断点如下:
这种方式虽然在建java对象的时候比较麻烦些(其实也不算麻烦),但是在使用的时候秩只需要上述一行代码,即可将json完全解析
在使用数据的时候只需要用 “对象 + 点 get方法” 的方式层级调用就可以得到数据 了.
上述只是一个复杂的示例, 其他的都是换汤不换药.