Java Jackson反序列化列表,跳过没有特定字段的元素

Java Jackson反序列化列表,跳过没有特定字段的元素,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我想用Jackson将JSON反序列化为列表 class Users { private List<User> users; } class User { private Integer id; private String name; } 反序列化期间应跳过第二个用户,第三个用户应包含在空名称的列表中。 是否可以使用Jackson?您可以在setter中过滤不需要的项目: public void setUsers(List<User> use

我想用Jackson将JSON反序列化为
列表

class Users {
    private List<User> users;
}

class User {
    private Integer id;
    private String name;
}
反序列化期间应跳过第二个用户,第三个用户应包含在空名称的列表中。
是否可以使用Jackson?

您可以在setter中过滤不需要的项目:

public void setUsers(List<User> users) {
    this.users = users.stream().filter(u -> u != null && u.id != null).collect(Collectors.toList());
}
public void setUsers(列出用户){
this.users=users.stream().filter(u->u!=null&&u.id!=null).collect(Collectors.toList());
}
以下是我的完整测试课程:

public static void main(String[] args)
{
    String json = "{ \"users\" : [{\"id\" : 123, \"name\" : \"Andrew\"}, {\"name\" : \"Bob\"}, {\"id\" : 789}]}";
    try {
        ObjectMapper mapper = new ObjectMapper();
        Users users = mapper.readValue(json, Users.class);
        System.out.println(users.users);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static class Users
{
    private List<User> users;

    public void setUsers(List<User> users)
    {
        this.users = users.stream().filter(u -> u != null && u.id != null).collect(Collectors.toList());
    }
}

public static class User
{
    public Integer id;
    public String name;
    @Override
    public String toString()
    {
        return"{id=" + id + ", name=" + name + "}";
    }
}
publicstaticvoidmain(字符串[]args)
{
字符串json=“{\'users\':[{\'id\':123,\'name\':\'Andrew\'},{\'name\':\'Bob\'},{\'id\':789}];
试一试{
ObjectMapper mapper=新的ObjectMapper();
Users=mapper.readValue(json,Users.class);
System.out.println(users.users);
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态类用户
{
私人名单用户;
公共用户(列表用户)
{
this.users=users.stream().filter(u->u!=null&&u.id!=null).collect(Collectors.toList());
}
}
公共静态类用户
{
公共整数id;
公共字符串名称;
@凌驾
公共字符串toString()
{
返回“{id=“+id+”,name=“+name+”}”;
}
}
输出:


[{id=123,name=Andrew},{id=789,name=null}]

我认为自定义反序列化程序可以完成如下所示的任务

    public class UserListDeserializer extends JsonDeserializer<List<User>> {

    @Override
    public List<User> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = p.readValueAsTree();
        Iterator<JsonNode> it = node.elements();
        List<User> userList=new ArrayList<>();
        while (it.hasNext()) {
            JsonNode user = it.next();
            if (user.get("id") != null) {
                User userObj = new User();
                userObj.setId(user.get("id").intValue());
                userObj.setName(user.get("name")!=null?user.get("name").textValue():null);
                userList.add(userObj);
            }

        }
        return userList;
    }
}
public class Users {
    @JsonDeserialize(using=UserListDeserializer.class)
    private List<User> users;
}
公共类UserListDeserializer扩展JsonDeserializer{
@凌驾
公共列表反序列化(JsonParser p,DeserializationContext ctxt)抛出IOException,JsonProcessingException{
JsonNode=p.readValueAsTree();
迭代器it=node.elements();
List userList=new ArrayList();
while(it.hasNext()){
JsonNode user=it.next();
if(user.get(“id”)!=null){
User userObj=新用户();
userObj.setId(user.get(“id”).intValue());
userObj.setName(user.get(“name”)!=null?user.get(“name”).textValue():null);
userList.add(userObj);
}
}
返回用户列表;
}
}
并注释用户类,如下所示

    public class UserListDeserializer extends JsonDeserializer<List<User>> {

    @Override
    public List<User> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = p.readValueAsTree();
        Iterator<JsonNode> it = node.elements();
        List<User> userList=new ArrayList<>();
        while (it.hasNext()) {
            JsonNode user = it.next();
            if (user.get("id") != null) {
                User userObj = new User();
                userObj.setId(user.get("id").intValue());
                userObj.setName(user.get("name")!=null?user.get("name").textValue():null);
                userList.add(userObj);
            }

        }
        return userList;
    }
}
public class Users {
    @JsonDeserialize(using=UserListDeserializer.class)
    private List<User> users;
}
公共类用户{
@JsonDeserialize(使用=UserListDeserializer.class)
私人名单用户;
}

您可以使用com.fasterxml.jackson.annotation完成此操作

像这样的事:):

publicstaticvoidmain(字符串[]args){
字符串json=“{\'users\':[{\'id\':123,\'name\':\'Andrew\'},{\'name\':\'Bob\'},{\'id\':789}];
试一试{
ObjectMapper mapper=新的ObjectMapper();
Users=mapper.readValue(json,Users.class);
字符串jsonInString=mapper.writeValueAsString(selectUsers(users.getUsers());
System.out.println(jsonInString);
}捕获(例外e){
e、 printStackTrace();
}
}
私有静态集合selectUsers(列出用户){
返回org.apache.commons.collections4.CollectionUtils.select(用户,新建org.apache.commons.collections4.Predicate(){
@凌驾
公共布尔求值(用户){
返回user.getId()!=null;
}
});
}
公共静态类用户实现可序列化{
私人名单用户;
/**
*@返回用户
*/
公共列表getUsers(){
返回用户;
}
/**
*@param users要设置的用户
*/
公共用户(列表用户){
this.users=用户;
}
}
@JsonIgnoreProperties(ignoreUnknown=true)
公共静态类用户实现可序列化{
/**
* 
*/
私有静态最终长serialVersionUID=4223240034979295550L;
@JsonInclude(JsonInclude.Include.NON_NULL)
公共整数id;
@NotNull
公共字符串名称;
/**
*@返回id
*/
公共整数getId(){
返回id;
}
/**
*@param id要设置的id
*/
公共无效集合id(整数id){
this.id=id;
}
/**
*@返回名称
*/
公共字符串getName(){
返回名称;
}
/**
*@param name要设置的名称
*/
公共void集合名(字符串名){
this.name=名称;
}
}

输出:[{“id”:123,“name”:“Andrew”},{“id”:789,“name”:null}]

检查此项。请显示您已编写的反序列化程序的代码。您是否尝试使用@JsonProperty(required=true)作为id属性?@DhruvPal我使用了一个使用
ObjectMapper
@Jayz的外国客户机我尝试过,但这样一来,没有
id
的项将包含空id值。您可以为此创建自定义反序列化程序task@SachinGupta你能给我举个例子吗?