前言

现今接口的设计越来越多的使用json格式来传输数据,最大的优点就是不受语言的限制,配合rest风格的接口用起来很是方便.

但是在java中为了获取json 数据的方便往往会将拿到的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中对应.

  • 第一步 : 建立xxx json数组里边的单元内容 下的
    yyy json数组和xxx 是同级的 所以也建立一下
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;
}
  • 第二步 : 建立对象 对应data数组里边的一个单元 , 包含了xxx , 和 yyy
    注意属性名称要对应xxx,yyy
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<Jb> data;

    public Jbbo(){}
    public Jbbo(String ret, String msg, List<Jb> data) {
        super(ret, msg);
        this.data = data;
    }
    public List<Jb> getData() {
        return data;
    }
    public void setData(List<Jb> 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方法” 的方式层级调用就可以得到数据 了.

上述只是一个复杂的示例, 其他的都是换汤不换药.

注意事项

  1. JSONObject是根据属性名来对应的, 属性名匹配不上不会赋值成功.
  2. 如果不想要某一个字段 , 可以直接在实体类中删掉即可.
  3. 若要实际跑通 , 要在上边加上构造方法以及get/set 方法. 上述是减少篇幅省略了.
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 2 个月前
8c391e04 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐