【问题标题】:Jackson read JSON and convert to Map<String,Object>Jackson 读取 JSON 并转换为 Map<String,Object>
【发布时间】:2016-11-09 20:37:00
【问题描述】:

我有一个 JSON,其中一个值是 ISO-8601 日期时间字符串。 我需要将其转换为 java.util.Date。我该怎么做?

我不确定下面的代码是否正确。

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.text.SimpleDateFormat;
import java.util.Map;

public class CustomObjectMapper extends ObjectMapper {

    private static final long serialVersionUID = 2686298573056737140L;
    private static final SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssZ" );


    public CustomObjectMapper() {
        super.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        super.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        super.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        super.setDateFormat(df);
    }

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new CustomObjectMapper();
        Map<String, Object> map  = mapper.readValue(JSON, new TypeReference<Map<String, Object>>(){});
        System.out.println(map);
        for(String key: map.keySet()) {
            Object val = map.get(key);
            System.out.println("keyName is " + key + " value is " + val + " value type is " + val.getClass());

        }
    }


    private static final String JSON = "{\"mybool\":true,\"mydate\":\"2016-02-11T18:30:00.511-08:00\",\"mystring\":\"test\",\"myint\":1234}";


}

当我打印地图内容时,我看到“mydate”值显示为字符串。

key is mybool value is true value type is class java.lang.Boolean
key is mydate value is 2016-02-11T18:30:00.511-08:00 value type is class java.lang.String
key is mystring value is test value type is class java.lang.String
key is myint value is 1234 value type is class java.lang.Integer

我可以将 Jackson 配置为键“mydate”的值类型必须为 java.util.Date 的位置吗?

【问题讨论】:

  • 如果您正在阅读地图,我认为您无法指定哪个值是日期。

标签: java date jackson


【解决方案1】:

假设您知道 JSON 结构,那么您可以使用 POJO 来映射其属性并使用 @JsonFormat 注释(可从 Jackson 2.0 获得),如下所示:

import com.fasterxml.jackson.annotation.JsonFormat

class MyPojo {

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    Date mydate

    String mystring
    Boolean mybool
    Integer myint    
}

然后在您的映射器类上:

MyPojo myPojo = mapper.readValue(JSON, MyPojo.class);

【讨论】:

  • 不幸的是,json 是由 Map 构建的,我不拥有它的内容 (json),因为 json 可以是任何内容。
  • 那么在这种情况下,您无能为力,是吗?我想知道如果您首先不知道 JSON 内容,为什么需要将该字符串作为日期。我唯一能想到的就是遍历地图并检查该值是否为 String 实例以及它是否与 ISO-8601 模式匹配(即:使用正则表达式)然后将 String 解析为 Date 对象。
  • 我最终循环遍历 Map 并寻找匹配 ISO 8601 的值来进行转换。
【解决方案2】:

不,你不能。 JSON 格式没有 Date 数据类型。它只能是字符串。因此,您必须自己将其解析为 java.util.Date 。 例如使用:

new java.util.Date(javax.xml.bind.DatatypeConverter.parseDateTime(val).getTimeInMillis());

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2014-01-29
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多