【问题标题】:Plain Old Java Objects from JSON or JSON-Schema来自 JSON 或 JSON-Schema 的普通旧 Java 对象
【发布时间】:2019-06-02 01:07:26
【问题描述】:

我有一个 Json 对象,我想在 POJO 中进行转换,问题是他的 1 个属性是一个值 c,它将具有我事先不知道的不同值。假设我对"$key"一无所知,或者可能是世界各地城市的名称

{
    "data": [{
        "id": 1,
        "name": "theName",
        "symbol": "theSymbol",
        "last_updated": "2018-06-02T22:51:28.209Z",
        "quote": {
            "$key": {
                "price": 9283.92,
            },
            "$key": {
                "price": 1,

            }
        }
    }],
    "status": {
        "timestamp": "2018-06-02T22:51:28.209Z",
        "error_code": 0,
        "error_message": "",
        "elapsed": 10,
        "credit_count": 1
    }
}

【问题讨论】:

  • 你能澄清一下“$key”的已知和未知吗?
  • 那部分你必须转换成Map<String,SomeClass>或类似的东西。

标签: java json spring-boot jackson gson


【解决方案1】:

由于“$key”是未知的,我的建议是将quote转换成Map<String, Map<String, Integer>>,这样“$key”的值就可以忽略了!这是我的代码:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.List;
import java.util.Map;

public class XmlParser {
    static class Entity {
        @JsonProperty("id")
        String id;
        @JsonProperty("name")
        String name;
        @JsonProperty("symbol")
        String symbol;
        @JsonProperty("last_updated")
        String lastUpdated;
        @JsonProperty("quote")
        Map<String, Map<String, Integer>> quote;
    }

    static class Data {
        @JsonProperty("data")
        List<Entity> data;
    }

    public static void main(String[] args) throws Exception {
    final String testJson = "{\"data\":[{\"id\":1,\"name\":\"theName\",\"symbol\":\"theSymbol\",\"last_updated\":\"2018-06-02T22:51:28.209Z\",\"quote\":{\"a\":{\"price\":9283.92},\"b\":{\"price\":1}}}]}";

        ObjectMapper mapper = new ObjectMapper();
        Data data = mapper.readValue(testJson, Data.class);
        System.out.println(mapper.writeValueAsString(data));
    }
}

【讨论】:

    【解决方案2】:

    您可以将$key 映射到JsonNode 类型的属性。它将有一个有效的 equals/hashCode,因此您可以对其进行比较,将其放入 HashMaps 等中,而无需进一步对其进行数据绑定(JsonNode 直接表示 Json(子)树。)

    【讨论】:

      【解决方案3】:

      我会以不同的方式解决这个问题。我会把它变成某种“元对象”,f.ex。像这样:

      {
      ....
      "unknownType": {
          "name": "$key",
          "value1": "9283.92",
          "value2": "tttt"
          }
      }
      

      这样你就消除了一层未知信息!您可以尝试将 valueN 字段解析为所有不同类型的值并抛出/捕获解析异常,从而找出正确的类型。

      HTH

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-09
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        相关资源
        最近更新 更多