我需要将某个JSON字符串转换为Java对象。我正在使用Jackson进行JSON处理。我无法控制输入JSON(我从web服务读取)。这是我的输入JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
下面是一个简化的用例:
private void tryReading() {
String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = null;
try {
wrapper = mapper.readValue(jsonStr , Wrapper.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("wrapper = " + wrapper);
}
我的实体类是:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
我的Wrapper类基本上是一个容器对象来获取我的学生列表:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
我一直得到这个错误和“包装器”返回null。我不知道少了什么。有人能帮帮我吗?
org.codehaus.jackson.map.exc.UnrecognizedPropertyException:
Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
at [Source: java.io.StringReader@1198891; line: 1, column: 13]
(through reference chain: Wrapper["wrapper"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
.from(UnrecognizedPropertyException.java:53)
我已经尝试了下面的方法,它适用于这样的JSON格式读取杰克逊。
使用已经建议的解决方案:用@JsonProperty("wrapper")注释getter
你的包装类
public Class Wrapper{
private List<Student> students;
//getters & setters here
}
我对包装类的建议
public Class Wrapper{
private StudentHelper students;
//getters & setters here
// Annotate getter
@JsonProperty("wrapper")
StudentHelper getStudents() {
return students;
}
}
public class StudentHelper {
@JsonProperty("Student")
public List<Student> students;
//CTOR, getters and setters
//NOTE: If students is private annotate getter with the annotation @JsonProperty("Student")
}
然而,这将为您提供格式的输出:
{"wrapper":{"student":[{"id":13,"name":Fred}]}}
更多信息请访问https://github.com/FasterXML/jackson-annotations
新的Firebase Android引入了一些巨大的变化;文档副本下面:
[https://firebase.google.com/support/guides/firebase-android]:
更新您的Java模型对象
和2一样。x SDK, Firebase Database会自动将传递给DatabaseReference.setValue()的Java对象转换为JSON,并可以使用DataSnapshot.getValue()将JSON读入Java对象。
在新的SDK中,当使用DataSnapshot.getValue()将JSON读入Java对象时,JSON中的未知属性现在默认被忽略,因此您不再需要@JsonIgnoreExtraProperties(ignoreUnknown=true)。
为了在将Java对象写入JSON时排除字段/getter,注释现在被称为@Exclude而不是@JsonIgnore。
BEFORE
@JsonIgnoreExtraProperties(ignoreUnknown=true)
public class ChatMessage {
public String name;
public String message;
@JsonIgnore
public String ignoreThisField;
}
dataSnapshot.getValue(ChatMessage.class)
AFTER
public class ChatMessage {
public String name;
public String message;
@Exclude
public String ignoreThisField;
}
dataSnapshot.getValue(ChatMessage.class)
如果JSON中有一个Java类之外的额外属性,你会在日志文件中看到这样的警告:
W/ClassMapper: No setter/field for ignoreThisProperty found on class com.firebase.migrationguide.ChatMessage
您可以通过在类上添加@IgnoreExtraProperties注释来消除此警告。如果你想让Firebase数据库的行为,因为它在2。如果有未知的属性,你可以在类上放一个@ThrowOnExtraProperties注释。
将Wrapper类更改为
public Class Wrapper {
@JsonProperty("wrapper") // add this line
private List<Student> students;
}
这样做的目的是将students字段识别为json对象的包装键。
此外,我个人更喜欢使用Lombok注解的getter和setter作为
@Getter
@Setter
public Class Wrapper {
@JsonProperty("wrapper") // add this line
private List<Student> students;
}
因为我没有同时用Lombok和@JsonProperty测试上面的代码,所以我建议您也将下面的代码添加到Wrapper类中,以覆盖Lombok的默认getter和setter。
public List<Student> getWrapper(){
return students;
}
public void setWrapper(List<Student> students){
this.students = students;
}
还可以使用Jackson来反序列化列表。