使用 Gson 将带有嵌套映射的 java class 写入自定义 json 格式
Write java class with nested Map to custom json format using Gson
什么 Java 数据结构可用于序列化为以下具有一组子对象的 Json?
示例:
{
"John": {
"Type": "Person",
"age": 30,
"Sean": {
"Type": "child",
"age": 3
},
"Julian": {
"Type": "child",
"age": 4
}
},
"Paul": {
"Type": "Person",
"age": 64,
"Stella": {
"Type": "child",
"age": 10
},
"James": {
"Type": "child",
"age": 12
}
}
}
写 John 和 Paul 可以通过以下方式完成:Map<String,Person>
但我不知道如何在没有 'children' 属性.
的情况下嵌套 Child
示例:
{
"John": {
"Type": "Person",
"age": 30,
"children": {
"Sean": {
"Type": "child",
"age": 3
},
"Julian": {
"Type": "child",
"age": 4
}
}
}
}
我不确定它是否相关,但 Gson 被用于创建 Json 文件
我不确定 GSON 是否可行,但 Jackson 可行。
使用 GSON,您可以尝试自定义 JsonSerializer
,它可能看起来像这样:
private static class PersonTypeSerializer implements JsonSerializer<Person> {
@Override
public JsonElement serialize(Person person, Type type, JsonSerializationContext jsonSerializationContext) {
JsonObject personJson = personToJson(person);
for (Map.Entry<String, Person> child : person.getChildren().entrySet()) {
personJson.add(child.getKey(), personToJson(child.getValue()));
}
return personJson;
}
private static JsonObject personToJson(Person person) {
JsonObject personJson = new JsonObject();
personJson.addProperty("Type", person.getType());
personJson.addProperty("age", person.getAge());
return personJson;
}
}
并像这样注册到 GSON 实例:
Gson gson = new GsonBuilder().registerTypeAdapter(Person.class, new PersonTypeSerializer())
.create();
请注意,代码假定类型 "Person"
和 "child"
都由相同的 Person
class 表示。如果没有,应该很容易修改。
什么 Java 数据结构可用于序列化为以下具有一组子对象的 Json?
示例:
{
"John": {
"Type": "Person",
"age": 30,
"Sean": {
"Type": "child",
"age": 3
},
"Julian": {
"Type": "child",
"age": 4
}
},
"Paul": {
"Type": "Person",
"age": 64,
"Stella": {
"Type": "child",
"age": 10
},
"James": {
"Type": "child",
"age": 12
}
}
}
写 John 和 Paul 可以通过以下方式完成:Map<String,Person>
但我不知道如何在没有 'children' 属性.
示例:
{
"John": {
"Type": "Person",
"age": 30,
"children": {
"Sean": {
"Type": "child",
"age": 3
},
"Julian": {
"Type": "child",
"age": 4
}
}
}
}
我不确定它是否相关,但 Gson 被用于创建 Json 文件
我不确定 GSON 是否可行,但 Jackson 可行。
使用 GSON,您可以尝试自定义 JsonSerializer
,它可能看起来像这样:
private static class PersonTypeSerializer implements JsonSerializer<Person> {
@Override
public JsonElement serialize(Person person, Type type, JsonSerializationContext jsonSerializationContext) {
JsonObject personJson = personToJson(person);
for (Map.Entry<String, Person> child : person.getChildren().entrySet()) {
personJson.add(child.getKey(), personToJson(child.getValue()));
}
return personJson;
}
private static JsonObject personToJson(Person person) {
JsonObject personJson = new JsonObject();
personJson.addProperty("Type", person.getType());
personJson.addProperty("age", person.getAge());
return personJson;
}
}
并像这样注册到 GSON 实例:
Gson gson = new GsonBuilder().registerTypeAdapter(Person.class, new PersonTypeSerializer())
.create();
请注意,代码假定类型 "Person"
和 "child"
都由相同的 Person
class 表示。如果没有,应该很容易修改。