java - 杰克逊忽略了特定的财产,但能够检查它是否可用
问题描述
有没有办法跳过反序列化的一些属性,但同时知道它们是否存在?
{
"id": 123,
"name": "My Name",
"picture": {
// a lot of properties that's not important for me
}
}
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private int id;
}
所以,我ignoreUnknown
是我想要的默认行为,因为我不想要name
字段和所有其他可能存在的字段。字段的值picture
也不重要。我只想知道picture
房产是否可用。我怎么能这样做?
解决方案
您可以添加一个boolean
属性和自定义反序列化器,它只读取给定的值并返回true
。Jackson
仅当有效负载中存在属性时才调用自定义反序列化器。
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.io.File;
import java.io.IOException;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./src/main/resources/test.json");
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(jsonFile, User.class));
}
}
class PropertyExistsJsonDeserializer extends JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
p.readValueAsTree(); //consume value
return Boolean.TRUE;
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
class User {
private int id;
@JsonDeserialize(using = PropertyExistsJsonDeserializer.class)
@JsonProperty("picture")
private boolean pictureAvailable;
//getters, setters, toString
}
上面的代码打印:
User{id=123, pictureAvailable=true}
推荐阅读
- java - 循环双向链表 Java - 解释
- bash - 带循环的猫无法读取长行
- core-data - 当数据不再匹配谓词时,不调用 NSFetchedResultsControllerDelegate
- vba - Access 2016 我在 VBE 中看不到访问类对象
- r - 将字符串转换为 R 日期时间对象的正确格式
- laravel - Laravel 发布错误
- accessibility - 无障碍角色申请
- java - birt 导出到excel时将单元格合并在一起
- c# - 需要用链接资源替换 html 中的嵌套图像,以便可以通过电子邮件发送
- python - NameError:未定义名称“test_soft”。公式在那里,但无法运行