【问题标题】:How to translate the Json in to POJO如何将 Json 翻译成 POJO
【发布时间】:2015-04-22 23:42:14
【问题描述】:

我有以下 JSON 需要能够在 POJO 中呈现,我怎么能 这样做?

JSON 每天有一个键,每个键的值是两个独立的逻辑数组,我使用的是 Jackson 库。

{
  "2014/01/02": [
    {"ABC": 2.25, "XYZ": 4.05},
    {"amazon.com": 3}
  ],
  "2014/01/03": [
    {"ABC": 13.02},
    {"amazon.com": 3}
  ]
}

【问题讨论】:

  • 您使用的是什么 JSON 库?杰克逊? GSON?
  • "并且每个键的值是两个单独的数组" - 不,不是。每个键映射到一个 JSON 对象的 JSON 数组。您可能需要更好地了解 JSON,然后才能解决此问题
  • 我看到了Map<String, List<Map<String, Object>>>。我没有看到 POJO
  • 我正在使用 Jackson,我的意思是它返回两个单独的逻辑数组,我已经更新了上面的示例 JSON sn-p 以反映这一点。

标签: java json jersey jackson dropwizard


【解决方案1】:

你没有太多选择。这是一个丑陋的 JSON。没有一致的格式,可以创建POJO。

您需要考虑的事项。这个{} 是一个 JSON 对象。我是 Java 映射术语,它既可以映射到 POJO,也可以映射到 Map。为了映射到 POJO,您需要通用属性名称和格式,而您似乎没有。这一切似乎都在变化。所以你可能需要使用Map。这是我的看法

{  // Start Map
  "2014/01/02": [ // Map key: start Array ( List<Map> )
    {"ABC": 2.25, "XYZ": 4.05},  // Start another Map
    {"amazon.com": 3}  // another Map

您可以使用@JsonAnySetter 进行简化,使用 POJO 包装器,但您最终仍将拥有 Map&lt;String, List&lt;Map&lt;String, Object&gt;&gt;,正如我在评论中指出的那样。如果您想要 POJO,则需要一些通用格式。

这里有一个例子来说明它的工作方式

POJO

public class Dynamic {
    private Map<String, Object> map = new HashMap<>();

    public Object get(String key) {
        return map.get(key);
    }

    public Map<String, Object> getMap() {
        return map;
    }

    @JsonAnySetter
    public void set(String name, Object value) {
        map.put(name, value);
    }
}

测试(使用您在 simple.json 文件中的准确 JSON)

public class Test {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        Dynamic dynamic = mapper.readValue(new File("simple.json"), Dynamic.class);
        for (String key : dynamic.getMap().keySet()) {
            System.out.println("key: " + key);
            System.out.println("--------");
            List<Map<String, Object>> list = (List<Map<String, Object>>) dynamic.get(key);
            for (Map<String, Object> map : list) {
                for (Map.Entry<String, Object> entry: map.entrySet()) {
                    System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
                }
            }
            System.out.println("========");
        }
    }
}

结果

key: 2014/01/03
--------
key: ABC, value: 13.02
key: amazon.com, value: 3
========
key: 2014/01/02
--------
key: ABC, value: 2.25
key: XYZ, value: 4.05
key: amazon.com, value: 3
========

【讨论】:

  • 您可以将Dynamic中的map类型更改为Map&lt;String, List&lt;Map&lt;String, Object&gt;&gt;&gt;并在get方法中返回List&lt;Map&lt;String, Object&gt;&gt;,这样就不需要强制转换了。这是我能想到的唯一改进
  • 不错的解决方案@peeskillet,但你应该在这里提到你使用了杰克逊库。
  • @Dev OP 已经提到他们使用了 Jackson(它也被标记了),这就是 Dropwizard 默认使用的,所以我只是认为可以忽略它 :-)
【解决方案2】:
    {
  "2014/01/02": [
    {"ABC": 2.25, "XYZ": 4.05},
    {}
  ],
  "2014/01/03": [
    {"ABC": 13.02},
    {"amazon.com": 3}
  ]
}
This is even JSON, but not useful. I would make JSON for this like below.
{
  [
     {date: '2014/01/01',data:[{abc: 13.02, "amazonCom": 3},{abc: 13.02, "amazonCom": 3}},
     {date: '2014/01/02',data:[{abc: 13.02, "amazonCom": 3},{abc: 13.02, "amazonCom": 3}},
   ]
}

Java
public jsonObj {

    private String date;
    private List<DateData> data;

   .... setter//getter

}

public class DateData {
   private double abc;
   private int amazoneCom;
    //constructor and getter/setter
}



You can use JSON libraries like below.

1. Jackson - http://jackson.codehaus.org/
2. Gson  - https://code.google.com/p/google-gson/

Those libraries helps you to convert json into Java Object and vise versa as well.

Hope it can help you with solving your problem.

【讨论】:

  • 这是我从 API 调用返回的 JSON。我无法更改它
【解决方案3】:

有很多方法可以将json转换为pojo。在这里,我分享几个 URL 来实现相同的目标

【讨论】:

    猜你喜欢
    • 2018-02-08
    • 2011-03-09
    • 2011-09-05
    • 2018-06-13
    • 2017-12-26
    • 2021-03-06
    • 1970-01-01
    • 2011-03-12
    • 2018-12-30
    相关资源
    最近更新 更多