【问题标题】:Write java class with nested Map to custom json format using Gson使用 Gson 将带有嵌套 Map 的 java 类写入自定义 json 格式
【发布时间】:2020-06-10 04:46:38
【问题描述】:

什么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 TypeAdapter 来覆盖子地图的 write,但我无法让它按预期工作,这似乎是一个非常麻烦的解决方案。

标签: java json gson


【解决方案1】:

我不确定 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 类表示。如果没有,应该很容易修改。

【讨论】:

  • 我希望将一些数据结构序列化到 Example Json,问题是如何用 Java 类表示 Json 示例
  • 啊,对了!抱歉,误解了。我已经编辑了原始答案。背后的想法保持不变。同样,我不确定这是否可以通过使用 GSON 的单个数据结构来完成。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多