【问题标题】:Jackson how to parse a filed which is also date value杰克逊如何解析也是日期值的文件
【发布时间】:2018-08-02 09:21:25
【问题描述】:

我有 HashMap<LocalDate,SundayServerValue> 从中将数据保存为 json 到文件

HashMap<LocalDate,SundayServerValue>

我制作这样的json字符串

String jsonToSaved = ob.writeValueAsString(sundayUpdateDateMap);

或者这个

ob.writeValue(new File(pathToSundayMapFile), sundayUpdateDateMap);

这就是 String jsonToSaved 的样子

两者都返回相同的 json 格式,其中没有 "data":"yyyy-MM-dd" 只是 "yyyy-MM-dd"

{"2018-08-05":[{"ip":"1.7.2.3","window1":true,"window2":false}, 
{"ip":"2.1.2.2","window1":false,"window2":true}]}

import json.LocalDateDeSerializer;

public class SundayJsonTemplate {

@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = LocalDateDeSerializer.class)
private LocalDate date;
private ArrayList<SundayServerValue> sundayServerValueList;

public SundayJsonTemplate() {
}

public SundayJsonTemplate(LocalDate date, ArrayList<SundayServerValue> 
sundayServerValueList) {
    this.date = date;
    this.setSundayServerValueList(sundayServerValueList);
}
[...]

}



public class SundayServerValue {
private String ip;
private boolean window1;
private boolean window2;
[...]

}

从这个 JSON 加载时,我如何使 ObjectMaper() 了解 "yyyy-MM-dd" 是字段名称和值?

【问题讨论】:

  • JSON 很简单,它只有一个键值对。您的数据应该是其中之一。

标签: java json jackson jackson-databind


【解决方案1】:

在类型为 LocalDate 的字段上使用 @JsonSerialize@JsonDeserialize 注释 -

@JsonSerialize(using = ToStringSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)

【讨论】:

  • 我看不到 LocalDateDeserializer.class 我的依赖项是 com.fasterxml.jackson.corejackson-core2.9。 6com.fasterxml.jackson.corejackson-annotations2.9.6com .fasterxml.jackson.modulejackson-module-jsonSchemacom.fasterxml.jackson.corejackson-databind
  • 它应该在另一个罐子里 - jackson-datatype-jsr310: mvnrepository.com/artifact/com.fasterxml.jackson.datatype/…
  • 所以我添加了这一点,但我仍然收到此错误 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造 jsonTemplate.SundayJsonTemplate 的实例(没有创建者,如默认构造,存在):无法反序列化来自 [Source: (String) [rest of json...] 处的对象值(无委托或基于属性的创建者)来自这行代码 SundayJsonTemplate readValue = ob.readValue(jsonToSaved, SundayJsonTemplate.class);
  • 能否在 SundayJsonTemplate 中也添加一个默认构造函数?
  • 我有这个 public SundayJsonTemplate(LocalDate date, ArrayList sundayServerValueList) { this.date = date; this.setSundayServerValueList(sundayServerValueList); }
【解决方案2】:

如果有人只需要一个可行的解决方案,我会写这篇文章。

首先我需要承认我在这个问题上花了很多时间后放弃了。 我想让它尽可能优化并学习,但我现在不想浪费更多时间。

这就是我反序列化这个 JSON 的工作

TypeReference<HashMap<String, ArrayList<SundayServerValue>>> typeReference = new TypeReference<HashMap<String,ArrayList<SundayServerValue>>>(){};


        HashMap<String, ArrayList<SundayServerValue>>
        map = ob.readValue(loadStringFromFile, typeReference);

在此之后,我只是创建一个新地图并将其中的String 转换为LocalDate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2018-02-26
    • 2018-08-25
    • 2014-08-22
    相关资源
    最近更新 更多