使用Gson实现树型Json数据 非多重List,Map嵌套

使用Gson实现树型Json数据 非多重List,Map嵌套

这里写代码片最近前端需要json数据,格式比较复杂,里面数组和对象多重嵌套,最初是想构造一个list,map的多重集合,然后通过@ResponseBody直接写到页面的json格式,后来想想就觉得头疼,嵌套太多貌似很傻的写法,然后搜搜json工具,有Jackson,Gson啥的,觉得Gson高大上吧,然后看了看官方文档,喏,就是这个地址,您瞧瞧:http://tool.oschina.net/apidocs/apidoc?api=gson2.2.2 选择JsonWriter即可
Gson api
里面有个例子,照着写就好了,这里就几个注意点:

  1. 必须使用{ }开始,所以必须是writer.beginObject()开始
  2. 如果begin和end没有对应上,可能读取的数据就不全了
  3. 对于if else 这种互斥的,需要在每个分支里面end(建议每个分支里面都从begin开始,而不是begin写在分支外面)
下面是例子

需要生成这种类型的json格式
如果是生成这种根据是否有子节点的Json格式的话

{
    "conType":[
        {
            "code":1,
            "name":"个人",
            "hasChild":0
        },
        {
            "code":2,
            "name":"公司",
            "hasChild":0
        }
    ],
    "dcCity":[
        {
            "code":244,
            "name":"湖北",
            "hasChild":[
                {
                    "code":245,
                    "name":"武汉",
                    "hasChild":0
                },
                {
                    "code":246,
                    "name":"黄石",
                    "hasChild":0
                },
                {
                    "code":247,
                    "name":"十堰",
                    "hasChild":0
                },
                {
                    "code":248,
                    "name":"宜昌",
                    "hasChild":0
                },
                {
                    "code":249,
                    "name":"襄阳",
                    "hasChild":0
                },
                {
                    "code":250,
                    "name":"鄂州",
                    "hasChild":0
                },
                {
                    "code":251,
                    "name":"荆门",
                    "hasChild":0
                },
                {
                    "code":252,
                    "name":"孝感",
                    "hasChild":0
                },
                {
                    "code":253,
                    "name":"荆州",
                    "hasChild":0
                },
                {
                    "code":254,
                    "name":"黄冈",
                    "hasChild":0
                },
                {
                    "code":255,
                    "name":"咸宁",
                    "hasChild":0
                },
                {
                    "code":256,
                    "name":"随州",
                    "hasChild":0
                },
                {
                    "code":257,
                    "name":"恩施",
                    "hasChild":0
                }
            ]
        },
        {
            "code":426,
            "name":"台湾",
            "hasChild":0
        },
        {
            "code":427,
            "name":"香港",
            "hasChild":0
        },
        {
            "code":428,
            "name":"澳门",
            "hasChild":0
        }
    ]
}

Java代码如下

    @Test
    //将dic_type和dic_data两张表中的数据拼接成为树状目录的json字符串
    public void showDic6() {
        //数据库查询条件,循环初始时需要clear所有键值,也可以放下面循环中每次新建
        Map<String, Object> conditions = new HashMap<>();
        //初始化spring容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml");
        //从容器中获得mapper代理对象
        DicTypeMapper typeMapper = ac.getBean(DicTypeMapper.class);
        DicDataMapper dataMapper = ac.getBean(DicDataMapper.class);
        try {
            //创建JsonWriter写入组合的json字符串到io流中
            OutputStream out = new ByteArrayOutputStream();
            JsonWriter writer = new JsonWriter(new OutputStreamWriter(out , "UTF-8"));
            //获的type列表和data列表
            List<DicType> dicTypeList = typeMapper.getAllDicType();
            List<DicData> dicDataList = dataMapper.getAllDicData();

            //开始写入对象,不同类别键名
            writer.beginObject();
            //遍历type列表,根据id在data列表中查找,在每个[]中存放该类型对应的多条数据
            for (DicType type : dicTypeList) {
                writer.name(type.getTypeCode());    //写入类别键名
                conditions.clear(); //循环初始时,对于多个键值对需要clear之前的值
                conditions.put("dtId", type.getId());
                List<DicData> dataList = dataMapper.getMultiConditionsDataList(conditions);
                //开始写入数组,该类别下的多条数据
                writer.beginArray();
                //查询数据库该类别的数据
                for (DicData dicData : dataList) {
                    //如果该条数据是子节点,那么就不能写入这个处于父节点的位置
                    if(dicData.getParentId() != 0) {
                        continue;
                    }
                    //如果该条数据是父节点,找到其下所有子节点写入数组
                    if(dicData.getHasChild() == 1) {
                        writer.beginObject();   //开始写入具体数据
                        writer.name("code").value(dicData.getCode());
                        writer.name("name").value(dicData.getName());
                        writer.name("hasChild");
                        conditions.put("parentId", dicData.getCode());
                        List<DicData> childList = dataMapper.getMultiConditionsDataList(conditions);
                        writer.beginArray();
                        for (DicData child : childList) {
                            writer.beginObject();
                            writer.name("code").value(child.getCode());
                            writer.name("name").value(child.getName());
                            writer.name("hasChild").value(child.getHasChild());
                            writer.endObject();
                        }
                        writer.endArray();
                        writer.endObject();
                    }else {
                        writer.beginObject();
                        writer.name("code").value(dicData.getCode());
                        writer.name("name").value(dicData.getName());
                        writer.name("hasChild").value(dicData.getHasChild());
                        writer.endObject();
                    }
                }
                writer.endArray();
            }
            writer.endObject();
            writer.flush(); //刷新缓冲到流
            System.out.println(out.toString());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
总结
  1. 首先需要分析目标Json数据的格式,对象和数组到底如何嵌套,先整个简单的样本数据分析清楚其结构组织
  2. 然后就简单了,在{ }地方调用beginObject,[ ]地方调用beginArray,建议和成对写括号一样,同时写出begin和end,避免漏掉end不对应情况
  3. 最后取出流里面的数据就可以看到生成的Json字符串了

下面这种废弃了,可以参考下如何写这种格式

如果是生成这种Json格式的话

{
    "conType":[
        {
            "name":"个人",
            "code":1
        },
        {
            "name":"公司",
            "code":2
        }
    ],
    "dcCity":[
        {
            "湖北":[
                {
                    "name":"武汉",
                    "code":245
                },
                {
                    "name":"黄石",
                    "code":246
                },
                {
                    "name":"十堰",
                    "code":247
                },
                {
                    "name":"宜昌",
                    "code":248
                },
                {
                    "name":"襄阳",
                    "code":249
                },
                {
                    "name":"鄂州",
                    "code":250
                },
                {
                    "name":"荆门",
                    "code":251
                },
                {
                    "name":"孝感",
                    "code":252
                },
                {
                    "name":"荆州",
                    "code":253
                },
                {
                    "name":"黄冈",
                    "code":254
                },
                {
                    "name":"咸宁",
                    "code":255
                },
                {
                    "name":"随州",
                    "code":256
                },
                {
                    "name":"恩施",
                    "code":257
                }
            ]
        },
        {
            "name":"台湾",
            "code":426
        },
        {
            "name":"香港",
            "code":427
        },
        {
            "name":"澳门",
            "code":428
        }
    ]
}
    @Test
    //将dic_type和dic_data两张表中的数据拼接成为树状目录的json字符串
    public void showDic5() {
        //数据库查询条件,循环初始时需要clear所有键值,也可以放下面循环中每次新建
        Map<String, Object> conditions = new HashMap<>();
        //初始化spring容器
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml");
        //从容器中获得mapper代理对象
        DicTypeMapper typeMapper = ac.getBean(DicTypeMapper.class);
        DicDataMapper dataMapper = ac.getBean(DicDataMapper.class);
        try {
            //创建JsonWriter写入组合的json字符串到io流中
            OutputStream out = new ByteArrayOutputStream();
            JsonWriter writer = new JsonWriter(new OutputStreamWriter(out , "UTF-8"));
            //获的type列表和data列表
            List<DicType> dicTypeList = typeMapper.getAllDicType();
            List<DicData> dicDataList = dataMapper.getAllDicData();

            //开始写入对象,不同类别键名
            writer.beginObject();
            //遍历type列表,根据id在data列表中查找,在每个[]中存放该类型对应的多条数据
            for (DicType type : dicTypeList) {
                writer.name(type.getTypeCode());    //写入类别键名
                conditions.clear(); //循环初始时,对于多个键值对需要clear之前的值
                conditions.put("dtId", type.getId());
                List<DicData> dataList = dataMapper.getMultiConditionsDataList(conditions);
                //开始写入数组,该类别下的多条数据
                writer.beginArray();
                //查询数据库该类别的数据
                for (DicData dicData : dataList) {
                    //如果该条数据是子节点,那么就不能写入这个处于父节点的位置
                    if(dicData.getParentId() != 0) {
                        continue;
                    }
                    //如果该条数据是父节点,找到其下所有子节点写入数组
                    if(dicData.getHasChild() == 1) {
                        writer.beginObject();   //开始写入具体数据
                        writer.name(dicData.getName());
                        conditions.put("parentId", dicData.getCode());
                        List<DicData> childList = dataMapper.getMultiConditionsDataList(conditions);
                        writer.beginArray();
                        for (DicData child : childList) {
                            writer.beginObject();
                            writer.name("name").value(child.getName());
                            writer.name("code").value(child.getCode());
                            writer.endObject();
                        }
                        writer.endArray();
                        writer.endObject();
                    }else {
                        writer.beginObject();
                        writer.name("name").value(dicData.getName());
                        writer.name("code").value(dicData.getCode());
                        writer.endObject();
                    }
                }
                writer.endArray();
            }
            writer.endObject();
            writer.flush(); //刷新缓冲到流
            System.out.println(out.toString());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gson 是 Google 提供的一个用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,它可以将 JSON 字符串转换为 Java 对象,也可以将 Java 对象转换为 JSON 字符串。下面是使用 Gson 库解析 JSON 数据的示例代码: 1. 添加 GSON 依赖 在项目的 build.gradle 文件中添加以下依赖: ```groovy dependencies { // ... implementation 'com.google.code.gson:gson:2.8.6' // ... } ``` 2. 定义 Java 类 首先,我们需要定义一个 Java 类来表示 JSON 数据的结构。假设我们要解析的 JSON 数据格式如下: ```json { "name": "张三", "age": 20, "isMale": true } ``` 那么,我们可以定义一个对应的 Java 类: ```java public class Person { private String name; private int age; private boolean isMale; // 构造函数、getters 和 setters 略 // ... } ``` 3. 解析 JSON 数据 接下来,我们可以使用 Gson 类的`fromJson()`方法将 JSON 字符串转换为 Java 对象。示例代码如下: ```java String jsonData = "{\"name\":\"张三\",\"age\":20,\"isMale\":true}"; // 替换成你要解析的 JSON 数据 Gson gson = new Gson(); Person person = gson.fromJson(jsonData, Person.class); ``` 以上代码中,`fromJson()`方法的第一个参数是要解析的 JSON 字符串,第二个参数是要转换为的 Java 类的类型。Gson 会自动将 JSON 中的字段映射到 Java 对象的属性中。 现在,`person`对象中就包含了从 JSON 字符串中解析出来的数据。我们可以通过调用`person.getName()`、`person.getAge()`等方法获取属性的值。 注意:使用 Gson 解析 JSON 数据的前提是,JSON 字符串的字段名要与 Java 对象的属性名匹配。如果不匹配,需要通过`@SerializedName`注解或`FieldNamingStrategy`接口来指定对应关系。具体使用方法可以参考 Gson 的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值