使用 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 表示。如果没有,应该很容易修改。