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

atmip9wb  于 2022-11-06  发布在  Java
关注(0)|答案(4)|浏览(196)

我100%肯定这个问题已经被问过无数次了,但是我真的不知道如何正确地处理这个问题。
基本上,这就是我想使用GSON创建的内容:

{
    "wrapper" : [
        {
            "content": "loremipsum",
            "positions": [0,3]
        },
        {
            "content": "foobar",
            "positions": [7]
        },
        {
            "content": "helloworld"
        }
    ]
}

分解一下,我们得到了一个数组的字段,其中包含的对象本身包含两个字段,其中一个Map到字符串,另一个Map到另一个数组,该数组可以包含未知数量的整数,或者可以完全缺失。
我甚至无法想象如何使用GSON获得这个结果。到目前为止,我的想法是将所有内容放在一个Map<String, List<Map<String, Object>>> beast中并对其进行转换,但这个Object让我很困扰,因为在这个特定的例子中,它可能是String或List。可能会有强制转换,但这听起来像是一个愚蠢的复杂的东西,如果我只是在String.format()或类似的格式中手动键入它,看起来会更容易。
有没有更简单的方法来处理这些东西?

oxiaedzo

oxiaedzo1#

我会为您的Data创建一些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
pgpifvop

pgpifvop2#

您可以使用gson JsonElement作为将包含JsonElement(如JsonObject或JsonArray)的容器对象
https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/JsonElement.html

inb24sb2

inb24sb23#

最好使用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);
vmpqdwk3

vmpqdwk34#

如果没有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}}}

相关问题