繁体   English   中英

Write java class with nested Map to custom json format using Gson

[英]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 表示。 如果没有,修改它应该很容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM