【问题标题】:Convert Json subobject to a HashMap with Jackson使用 Jackson 将 Json 子对象转换为 HashMap
【发布时间】:2017-11-01 13:58:36
【问题描述】:

我想转换以下json字符串的bpi字段:

{
    "bpi": {
        "2017-10-15": 5697.3917,
        "2017-10-16": 5754.2213,
        "2017-10-17": 5595.235,
        "2017-10-18": 5572.1988,
        "2017-10-19": 5699.5838,
        "2017-10-20": 5984.0863,
        "2017-10-21": 6013.2288,
        "2017-10-22": 5984.9563,
        "2017-10-23": 5895.2988,
        "2017-10-24": 5518.85,
        "2017-10-25": 5733.9038,
        "2017-10-26": 5888.145,
        "2017-10-27": 5767.68,
        "2017-10-28": 5732.825,
        "2017-10-29": 6140.5313,
        "2017-10-30": 6121.8,
        "2017-10-31": 6447.6675
    },
        "disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index. BPI value data returned as USD.",
        "time": {
        "updated": "Nov 1, 2017 13:49:57 UTC",
        "updatedISO": "2017-11-01T13:49:57+00:00"
    }
}

进入一个哈希映射 - 最好是Map<Date, Double>Map<String, String> 也可以(然后我必须稍后处理它)。我在某处读到了如何将 json 数组转换为 java 数组,但由于所需的数组包含在 bpi 子字段中,我不知道如何访问它。你能帮我解决这个问题吗?

非常感谢

【问题讨论】:

    标签: java arrays json jackson


    【解决方案1】:

    杰克逊很直接。首先定义一个类来保存值:

    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Foo {
    
        private Map<LocalDate, Double> bpi;
    
        // Getters and setters ommited
    }
    

    然后读取您的 JSON 字符串:

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    
    Foo foo = mapper.readValue(json, Foo.class);
    

    您也可以使用:

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    
    JsonNode node = mapper.readTree(json).get("bpi");
    
    ObjectReader reader = mapper.readerFor(new TypeReference<Map<LocalDate, Double>>() {});
    Map<LocalDate, Double> bpi = reader.readValue(node);
    

    LocalDate 支持来自 jackson-datatype-jsr310 模块。

    在您的项目中添加以下依赖项:

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    

    然后在您的ObjectMapper 实例中注册JavaTimeModule

    mapper.registerModule(new JavaTimeModule());
    

    如果您更喜欢使用Date 而不是LocalDate,那么您不需要添加任何依赖项,也不需要注册任何模块。只需在上面的示例中使用Date 而不是LocalDate。不过我建议你改用LocalDate

    【讨论】:

    • 而且jackson还负责从StringDate/LocalDate的转换?
    • @milkpirate 是的。请参阅我的更新答案。 jackson-datatype-jsr310 依赖项是必需的。
    猜你喜欢
    • 2016-06-17
    • 2017-08-31
    • 1970-01-01
    • 2016-09-23
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2018-07-19
    相关资源
    最近更新 更多