我有一个用例,其中将对象作为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
答案 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()方法中的格式解析日期字符串。