尝试将 JSON 反序列化/序列化到我创建的 Java bean 中。对于 jackson 和这项努力来说真的很陌生,所以请耐心等待。我有以下内容:
{
"foo": {
"firstBlock": {
"myValue": 1,
"someBool": true,
"stringValue": "OK"
},
"anotherBlock": {
"values": [
{
"yikes01": 42
},
{
"yikes02": 215
}
],
"myInt": 64,
"logging": "Yes"
}
}
}
由于 JSON 中的对象被重复使用,我的 Java bean 被分解为几个,所以它会是:
@JsonRootName("foo")
public class FooBean {
private FirstBlockBean firstBlock;
private AnotherBlockBean anotherBlock;
@JsonGetter("firstBlock")
public FirstBlockBean getFirstBlock() { return firstBlock; }
@JsonSetter("firstBlock")
public void setFirstBlock(FirstBlockBean firstBlock) { this.firstBlock = firstBlock; }
@JsonGetter("anotherBlock")
public AnotherBlockBean getAnotherBlock() { return anotherBlock; }
@JsonSetter("firstBlock")
public void setAnotherBlock(AnotherBlockBean anotherBlock) { this.anotherBlock = anotherBlock; }
}
@JsonRootName("firstBlock")
public class FirstBlockBean {
private int myValue;
private Boolean someBool;
private String stringValue;
@JsonGetter("myValue")
public int getMyValue() { return myValue; }
@JsonSetter("myValue")
public void setMyValue(int myValue) { this.myValue = myValue; }
@JsonGetter("someBool")
public Boolean getSomeBool() { return someBool; }
@JsonSetter("someBool")
public void setSomeBool(Boolean someBool) { this.someBool = someBool; }
@JsonGetter("stringValue")
public String getStringValue() { return stringValue; }
@JsonSetter("someBool")
public void setStringValue(String stringValue) { this.stringValue = stringValue; }
}
...和 AnotherBlockBean
类以类似的方式实现(为简洁起见,省略。)我使用 Jackson 来实现此目的,我的问题是 - Jackson 中是否有一种用于序列化和反序列化的机制这个案例?理想情况下,我想要类似的东西(下面的伪代码,因为我无法通过 Google 搜索或此处的搜索来显示任何内容):
// Assume "node" contains a JsonNode for the tree and foo is an uninitialized FooBean class object.
JsonHelper.deserialize(node, FooBean.class, foo);
此时我可以读回这些值:
int i = foo.getFirstBlock().getMyValue();
System.out.println("i = " + i); // i = 1
同样,我希望能够获取 foo 实例并使用另一种方法将其序列化回 JSON。我是否梦想想要这种内置功能,或者它是否存在?
最佳答案
使用 Jackson 时的主要类是 ObjectMapper。它有很多选项,看看可用的方法。
这是一个典型的帮助器类的示例,它使用 ObjectMapper 在 Java 对象和字符串之间进行转换。
public class JsonHelper {
private ObjectMapper objectMapper;
public JsonHelper(){
this.objectMapper = new ObjectMapper();
// Your mapping preferences here
this.objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
this.objectMapper.setSerializationInclusion(Include.NON_NULL);
this.objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
}
public String serialize(Object object) {
try {
return this.objectMapper.writeValueAsString(object);
} catch (Exception e) {
// TODO Handle exception
return null;
}
}
public <T> T deserialize(String json, Class<T> clazz) {
try {
return this.objectMapper.readValue(json, clazz);
} catch (Exception e) {
// TODO Handle exception
return null;
}
}
public <T> T deserialize(String json, TypeReference<T> valueTypeRef) {
try {
return this.objectMapper.readValue(json, valueTypeRef);
} catch (Exception e) {
// TODO Handle exception
return null;
}
}
}
一些提示:
- 如果 getter 和 setter 方法的名称遵循通常的约定,则可以省略 @JsonGetter 和 @JsonSetter 注解,而仅在字段声明中使用 @JsonProperty 注解
- 如果java字段的名称等于JSON中的节点名称,您还可以省略@JsonProperty注释(Jackson将映射具有匹配名称的JSON节点和Java字段)。
关于java - 使用 Jackson 序列化和反序列化针对 JAVA 类的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60871973/