【问题标题】:Parsing JSON with java : dynamic keys用 java 解析 JSON:动态键
【发布时间】:2015-02-17 17:20:34
【问题描述】:

我需要在 java 中创建一个包含一些动态字段的 JSON 响应。这是我要返回的 JSON 响应的示例:

{
    "success": true,
    "completed_at": 1400515821,
    "<uuid>": {
        type: "my_type",
        ...
    }, 
    "<uuid>": {
        type: "my_type",
        ...
    }
}

“success”和“completed_at”字段易于格式化。如何格式化字段?对应的 java 对象是什么?

基本上我想使用 2 个 java 对象:

public class ApiResponseDTO {

    private boolean success;
    private DateTime completedAt;

    ...
}

public class AuthenticateResponseDTO extends ApiResponseDTO {

    public List<ApplianceResponseDTO> uuids = new     ArrayList<ApplianceResponseDTO>();

}

这些 java 对象不符合预期的 JSON 格式。如果我可以将 JSON 格式更改为有一个列表,它会起作用,但我不能更改它。

非常感谢!

【问题讨论】:

  • 映射到 &lt;uuid&gt; 的 JSON 值是否始终相同?
  • 动态键是否总是命名为&lt;uuid&gt;? JSON 对重复键有未定义的行为。
  • 如果你可以将这个相似的部分包装成单独的对象,你可以将它存储为地图:stackoverflow.com/questions/28548380/…
  • 而不是 ,我将有像“ae12-54ef-dfd...”这样的值,所以我不会有重复的键。内部 json 将始终相同(类型、更新日期...)。我已经看到这个答案@Pshemo,但在这个例子中,地图被命名为“细节”。就我而言,我不会有命名地图。解决方案可能真的很简单,但我看不到......
  • 你能改变这个 JSON 的结构吗?如果是这样,只需将您的 "completed_at":1400515821, "uuid1":{data1}, "uuid2":{data2} 集包装成 "completed_at":1400515821, "details":{"uuid1":{data1},"uuid2":{data2}} 之类的东西,现在您就可以毫无问题地使用 Map。

标签: java json parsing gson


【解决方案1】:

您可以使用 javax.json 库,特别是 JsonObjectBuilderJsonArrayBuilder 将数据转换为 JSON 格式。您可能想要嵌套几层 toJson() 方法,它可以为您提供您正在寻找的字符串表示,或者您想要的 JsonObject/JsonArray。像这样的:

JsonArray value = null;
JsonArrayBuilder builder = Json.createArrayBuilder();
for (ApplianceResponseDTO apr : uuids) {
    builder.add(apr.toJson());
}
value = builder.build();
return value;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2018-12-25
    • 1970-01-01
    相关资源
    最近更新 更多