如何将日期序列化为HashMap?

时间:2018-07-30 00:05:46

标签: java json serialization gson

我有一个用例,其中将对象作为json字符串获取,并且需要将其连续转换为HashMap。我的代码如下:

public Map<String, Object> toMap(String jsonString) {
  Gson gson = new Gson();

  Type type = new TypeToken<Map<String, Object>>() {
  }.getType();
  Map<String, Object> mapped = gson.fromJson(jsonString, type);
  return mapped;
}

我从jsonString获得的日期值为"date": "2018-07-29T23:52:35.814Z",但是在序列化为HashMap后,“ date”值是String而不是Date对象。有办法解决吗?甚至欢迎不使用Gson的解决方案

jsonString示例如下:

{
    "id": "1351",
    "date": "2018-07-30T00:32:31.564Z",
    "university": "US",
    "typeofwork": "Report",
    "title": "Thesis title",
    "subject": "Masters",
    "noofwords": "123"
}

为了澄清,我本身在序列化/反序列化方面没有任何错误。我只希望date的类型为java.util.Date,这样对if(map.get("date") instanceOf java.util.Date)的验证将返回true

2 个答案:

答案 0 :(得分:0)

您可以使用Jackson中的customDeserialzer类来做到这一点:

public class CustomDeserializer extends JsonDeserializer {
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    if(p.getCurrentName().equals("date")){
        try {
            return new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS").parse(p.getText());
        }catch (Exception ex){
        }
        return p.getText();
    }
    return p.getText();
}
}

然后像这样解析:

ObjectMapper objectMapper = new ObjectMapper();
    Map<String, Object> hashMap = new HashMap<>();
    String json = "{\"date\": \"2018-07-29T23:52:35.814Z\"}";
    SimpleModule module = new SimpleModule().addDeserializer(String.class, new CustomDeserializer());
    objectMapper.registerModule(module);
    hashMap = objectMapper.readValue(json,new TypeReference<HashMap<String,Object>>(){});
    hashMap.entrySet().parallelStream().forEach(e -> System.out.println(e.getValue()));

答案 1 :(得分:0)

如果您确切地知道属性“ date”是一个Date,那么在从Json解析后,您可以尝试以下操作:

String dateStr = mapped.get("date");
mapped.put("date",new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(dateStr));

如果您不想手动执行此操作,只需定义一个与您的Json对象格式匹配的类(将“ date”字段声明为Date对象),然后:

Gson g = new GsonBuilder().setDateFormat("your date format").create();
NewClass obj = g.fromJson(jsonStr, NewClass.class);

Gson将按照setDateFormat()方法中的格式解析日期字符串。