Java 使用Jackson将JSON数据读入数组/列表
我已经看到并阅读了一些关于这个问题的问题,但似乎没有一个能解决我的问题。我很可能犯了一个(或两个)轻微但严重的错误,但我没有看到它们 我的JSON看起来是这样的(真实的示例要复杂得多,但这就是我将其缩减为的内容): 我以前读过的代码是: StormData.java:Java 使用Jackson将JSON数据读入数组/列表,java,arrays,json,jackson,Java,Arrays,Json,Jackson,我已经看到并阅读了一些关于这个问题的问题,但似乎没有一个能解决我的问题。我很可能犯了一个(或两个)轻微但严重的错误,但我没有看到它们 我的JSON看起来是这样的(真实的示例要复杂得多,但这就是我将其缩减为的内容): 我以前读过的代码是: StormData.java: public class StormData { @JsonCreator StormData ( String atcID, String name ) { this.atcID = atcID; this.n
public class StormData {
@JsonCreator
StormData ( String atcID, String name ) {
this.atcID = atcID;
this.name = name;
};
public String getAtcID() {
return atcID;
}
public void setAtcID( String atcID ) {
this.atcID = atcID;
}
String atcID;
String name;
}
主文件:
byte[] jsonData = Files.readAllBytes(Paths.get(fileName));
ObjectMapper objectMapper = new ObjectMapper();
List<StormData> myObjects = objectMapper.readValue(jsonData , new TypeReference<List<StormData>>(){});
那么我错过了什么?TIA.您需要在构造函数上使用注释:
@JsonCreator
,在每个参数上使用注释:@JsonProperty
:
@JsonCreator
StormData (@JsonProperty("atcID") String atcID, @JsonProperty("name") String name) {
this.atcID = atcID;
this.name = name;
}
看
由于JDK 8,您还可以注册JacksonParameterNamesModule
并使用-parameters
选项编译代码。
请参阅中的详细信息。尝试创建默认构造函数。如果要使用单参数构造函数,请使用
@JsonCreator
注释。在您的示例中,Jackson尝试创建对象,然后使用setter方法来设置属性。好的,如果我将@JsonCreator添加到构造函数中(请参阅上面原始(已编辑)文章中的编辑),那么它就可以工作了!但如果随后添加第二个字段“name”(请参见上面的编辑),则会出现一个新错误:typeStormData
的类型定义无效:参数#0没有属性名称,不可注入:不能用作创建者[StormData的构造函数,注释:尝试使用@JsonProperty。示例:感谢您的建议。但首先,JsonProperty生成一个错误“此位置不允许”。如果忽略此错误,则返回到“无法构造StormData的实例”
(没有创建者…”您需要在构造函数上同时使用注释:@JsonCreator
,在每个参数上使用注释:@JsonProperty
。请参阅我上面提供的官方文档的链接。对我有用。
Cannot construct instance of `StormData` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
@JsonCreator
StormData (@JsonProperty("atcID") String atcID, @JsonProperty("name") String name) {
this.atcID = atcID;
this.name = name;
}