为了账号安全,请及时绑定邮箱和手机立即绑定

使用 GSON 在 Java 中创建不同格式的嵌套 JSON 对象

使用 GSON 在 Java 中创建不同格式的嵌套 JSON 对象

守候你守候我 2023-08-16 18:22:09
我百分百确定这个问题已经被问过一百万次了,但我真的不确定如何正确处理这个问题。我还没有对 JSON 做太多工作,也没有对其进行序列化。基本上,这就是我想使用 GSON 创建的内容:{    "wrapper" : [        {            "content": "loremipsum",            "positions": [0,3]        },        {            "content": "foobar",            "positions": [7]        },        {            "content": "helloworld"        }    ]}分解它,我们有一个数组字段,其中包含对象,这些对象本身包含两个字段,其中一个映射到字符串,另一个映射到另一个数组,该数组可以包含未知数量的整数,也可以完全缺失。我什至无法想象如何用 GSON 得到这个结果。到目前为止,我的想法是将所有内容都放在野兽中Map<String, List<Map<String, Object>>>并对其进行转换,但是该对象让我烦恼,因为在这种特殊情况下它可能是字符串或列表。可能会有强制转换,但这听起来像是一件愚蠢而复杂的事情,如果我只是在 String.format() 或类似的内容中手动键入它,看起来会更容易。难道就没有更简单的方法来处理这些东西吗?
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

我会为您的数据创建一些 POJO 类:


class MyData {

    private List<Data> wrapper;


    //getters setters constructors

}


class Data {

    private String content;

    private List<Integer> positions;


    //getters setters constructors

}

然后反序列化它:


Gson gson = new Gson();

String json = //json here

MyData myData = gson.fromJson(myJson, MyData.class);

对于序列化:


MyData myData = ...

String json = gson.toJson(myData);

另一种方法可以是使用JsonParser并访问其元素来解析该结构:


JsonParser jsonParser = new JsonParser();

JsonElement jsonElement = jsonParser.parse(json);

JsonElement wrapperElement = jsonElement.getAsJsonObject().get("wrapper"); //access wrapper

JsonArray array = wrapperElement.getAsJsonArray(); // access array


查看完整回答
反对 回复 2023-08-16
?
慕后森

TA贡献1802条经验 获得超5个赞

没有POJO,这似乎可以使用Gson解决嵌套JSON解决方案


package com.test;


import com.google.gson.JsonObject;


public class Main {


    public static void main(String[] args) {

        

        JsonObject ex3 = new JsonObject();

        ex3.addProperty("example3", 30);

        

        JsonObject ex2 = new JsonObject();  

        ex2.add("example2", ex3.getAsJsonObject());

        

        JsonObject ex1 = new JsonObject();  

        ex1.add("example1", ex2.getAsJsonObject());

        

        System.out.println(ex1.toString());

    }       

}

输出是:


{"example1":{"example2":{"example3":30}}}


查看完整回答
反对 回复 2023-08-16
?
慕容708150

TA贡献1831条经验 获得超4个赞

最好使用Pojo进行格式化。


class Wrapper{

 private List<Data> data;

 // geters, seters

}

class Data{

 private String content;

 private List<Integer> positions;

 // geters, seters

}

对于反序列化/序列化,您可以使用Jackson


ObjectMapper mapper = new ObjectMapper();

Wrapper wriper = mapper.readValue(dataString, Wrapper.class);

String jsonString = mapper.writeValueAsString(wriper);

或Gson


Gson gson = new Gson();

Wrapper wriper = gson.fromJson(dataString, Wrapper.class);

String json = gson.toJson(wriper);


查看完整回答
反对 回复 2023-08-16
  • 3 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信