使用 GSON 在 Java 中创建具有不同格式的嵌套 JSON 对象
Creating nested JSON objects with different formats in Java with GSON
我 100% 确定这个问题已经被问过一百万次了,但我真的不确定如何正确处理这个问题。我还没有对 JSON 做很多事情,也没有对其进行序列化。
基本上,这就是我想使用 GSON 创建的内容:
{
"wrapper" : [
{
"content": "loremipsum",
"positions": [0,3]
},
{
"content": "foobar",
"positions": [7]
},
{
"content": "helloworld"
}
]
}
将其分解,我们有一个数组字段,包含本身包含两个字段的对象,其中一个映射到字符串,另一个映射到另一个数组,该数组可以包含未知数量的整数或者可以完全缺失。
我什至无法想象如何用 GSON 得到这个结果。到目前为止,我的想法是将所有内容都放在 Map<String, List<Map<String, Object>>>
beast 中并进行转换,但是那个 Object 困扰着我,因为在这种特殊情况下它可能是 String 或 List。可能会有演员表,但这听起来像是一件愚蠢复杂的事情,如果我只是在 String.format() 或类似的地方手动输入它看起来会更容易。
有没有更简单的方法来处理这些东西?
我会为您的数据创建一些 POJO class :
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
格式化还是用Pojo比较好
class Wrapper{
private List<Data> data;
// geters, seters
}
class Data{
private String content;
private List<Integer> positions;
// geters, seters
}
对于 deserialization/serealization 你可以使用 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);
您可以使用 gson JsonElement 作为包含 JsonElement 的容器对象,如 JsonObject 或 JsonArray
https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/JsonElement.html
没有 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}}}
我 100% 确定这个问题已经被问过一百万次了,但我真的不确定如何正确处理这个问题。我还没有对 JSON 做很多事情,也没有对其进行序列化。
基本上,这就是我想使用 GSON 创建的内容:
{
"wrapper" : [
{
"content": "loremipsum",
"positions": [0,3]
},
{
"content": "foobar",
"positions": [7]
},
{
"content": "helloworld"
}
]
}
将其分解,我们有一个数组字段,包含本身包含两个字段的对象,其中一个映射到字符串,另一个映射到另一个数组,该数组可以包含未知数量的整数或者可以完全缺失。
我什至无法想象如何用 GSON 得到这个结果。到目前为止,我的想法是将所有内容都放在 Map<String, List<Map<String, Object>>>
beast 中并进行转换,但是那个 Object 困扰着我,因为在这种特殊情况下它可能是 String 或 List。可能会有演员表,但这听起来像是一件愚蠢复杂的事情,如果我只是在 String.format() 或类似的地方手动输入它看起来会更容易。
有没有更简单的方法来处理这些东西?
我会为您的数据创建一些 POJO class :
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
格式化还是用Pojo比较好
class Wrapper{
private List<Data> data;
// geters, seters
}
class Data{
private String content;
private List<Integer> positions;
// geters, seters
}
对于 deserialization/serealization 你可以使用 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);
您可以使用 gson JsonElement 作为包含 JsonElement 的容器对象,如 JsonObject 或 JsonArray
https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/JsonElement.html
没有 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}}}