Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson数据绑定反序列化:跳过依赖于值的元素_Java_Android_Json_Jackson - Fatal编程技术网

Java Jackson数据绑定反序列化:跳过依赖于值的元素

Java Jackson数据绑定反序列化:跳过依赖于值的元素,java,android,json,jackson,Java,Android,Json,Jackson,我正在使用jackson库反序列化json数据。 如果属性不符合条件,是否有方法跳过某些元素 比如说 java类: @JsonIgnoreProperties(ignoreUnknown = true) public class Group { private String name; private int id; private List<User> userList; } @JsonIgnoreProperties(ignoreUnknown = true)

我正在使用jackson库反序列化json数据。 如果属性不符合条件,是否有方法跳过某些元素

比如说

java类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Group
{
   private String name;
   private int id;
   private List<User> userList;
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class User
{
   private String firstName;
   private String lastName;
   private boolean deleted;
}
通常我应该这样做:

ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
test.Group g1 = mapper.readValue(jsonString,test.Group.class);
现在,是否可以跳过属性“deleted”值为true的每个用户元素? 我有没有一种方法可以通过数据绑定实现这一点,或者我必须使用另一种方法,比如树或流

编辑

我是为android开发的,不是桌面。
这个问题的原因是,可能有数千个用户元素,我希望尽量减少内存使用。

不是跳过,而是在使用Java 8阅读后删除(假设您的
用户
有一个
删除
的getter):


您可以通过解析到树节点,然后在节点上进行过滤来注入中介体。例如:

public static void main(String[] args) 
{

    Group g = new Group();
    g.setId(1);
    g.setName("Test");

    User u1 = new User();
    u1.setDeleted(false);
    u1.setFirstName("John");
    u1.setLastName("Jones");

    User u2 = new User();
    u2.setDeleted(true);
    u2.setFirstName("Jane");
    u2.setLastName("Jones");

    g.addUser(u1);
    g.addUser(u2);

    try
    {
        ObjectMapper mapper = new ObjectMapper();
        String jsonVal = mapper.writeValueAsString(g);
        JsonNode node = mapper.readTree(jsonVal);

        for (Iterator<Entry<String, JsonNode>> it = node.fields(); it.hasNext(); ) 
        {
            Map.Entry<String, JsonNode> field = it.next();
            String key = field.getKey();

            if ("userList".equals(key))
            {                   
                JsonNode users = field.getValue();

                if (users.isArray())
                {
                    for (Iterator<JsonNode> x = users.iterator(); x.hasNext();)
                    {
                        JsonNode entry = x.next();
                        if (entry.get("deleted").asBoolean())
                        {
                            System.out.println("Remove " + entry.get("firstName").asText() + " " + entry.get("lastName").asText());
                            x.remove();
                        }
                        else
                        {
                            System.out.println("Don't remove " + entry.get("firstName").asText() + " " + entry.get("lastName").asText());
                        }
                    }
                }
            }
        }

        Group grp = mapper.treeToValue(node, Group.class);
        System.out.println("Final group: " + grp);
    }
    catch (Exception e)
    {
        System.out.println("Something went wrong...");
        e.printStackTrace();
    }
}
下面是在组对象上使用自定义反序列化器的第二种方法。这只是我读到的一些东西,因此可以增加效率:

public class Answer28536024 {

@JsonDeserialize(using = GroupDeserializer.class)
public static class Group
{
   private String name;
   private int id;
   private List<User> userList;

   public Group()
   {
       userList = new ArrayList<User>();
   }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void addUser(User u)
    {
        userList.add(u);
    }

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "Group [name=" + name + ", id=" + id + ", userList=" + userList
                + "]";
    }      
}

public static class GroupDeserializer extends JsonDeserializer<Group>
{

    @Override
    public Group deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);

        Group group = new Group();
        group.setName(node.get("name").asText());
        group.setId(node.get("id").asInt());


        JsonNode users = node.get("userList");
        if (users.isArray())
        {
            for (JsonNode userNode : users)
            {
                if (!userNode.get("deleted").asBoolean())
                {
                    User user = new User();
                    user.setFirstName(userNode.get("firstName").asText());
                    user.setLastName(userNode.get("lastName").asText());
                    user.setDeleted(false);

                    group.addUser(user);
                }
            }
        }

        return group;
    }       
}


public static class User
{
   private String firstName;
   private String lastName;
   private boolean deleted;

   public User()
   {

   }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public boolean isDeleted() {
        return deleted;
    }

    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }

    @Override
    public String toString() {
        return "User [firstName=" + firstName + ", lastName=" + lastName
                + ", deleted=" + deleted + "]";
    }
}

public static void main(String[] args) 
{       
    Group g = new Group();
    g.setId(1);
    g.setName("Test");

    User u1 = new User();
    u1.setDeleted(false);
    u1.setFirstName("John");
    u1.setLastName("Jones");

    User u2 = new User();
    u2.setDeleted(true);
    u2.setFirstName("Jane");
    u2.setLastName("Jones");

    g.addUser(u1);
    g.addUser(u2);

    try
    {
        ObjectMapper mapper = new ObjectMapper();

        String jsonVal = mapper.writeValueAsString(g);
        System.out.println(jsonVal);

        Group grp = mapper.readValue(jsonVal, Group.class);
        System.out.println("Final group: " + grp);
    }
    catch (Exception e)
    {
        System.out.println("Something went wrong...");
        e.printStackTrace();
    }
}

}

不幸的是,这不是一个选择。这是在android上完成的,因此不是在Java8中完成的。这个问题的原因是,可能有成千上万的用户,我想限制内存的使用。我将编辑我的问题。听起来很有趣,但据我所知,mapper.readTree会将孔文档(或字符串)缓存为对象,因此如果有数千个用户,它已经使用了大量内存?!?我对此不确定。。。今天晚些时候我会试试的!添加了我在谷歌搜索的第二种方法,以防更有利。学习新东西,热爱它:)
public static void main(String[] args) 
{

    Group g = new Group();
    g.setId(1);
    g.setName("Test");

    User u1 = new User();
    u1.setDeleted(false);
    u1.setFirstName("John");
    u1.setLastName("Jones");

    User u2 = new User();
    u2.setDeleted(true);
    u2.setFirstName("Jane");
    u2.setLastName("Jones");

    g.addUser(u1);
    g.addUser(u2);

    try
    {
        ObjectMapper mapper = new ObjectMapper();
        String jsonVal = mapper.writeValueAsString(g);
        JsonNode node = mapper.readTree(jsonVal);

        for (Iterator<Entry<String, JsonNode>> it = node.fields(); it.hasNext(); ) 
        {
            Map.Entry<String, JsonNode> field = it.next();
            String key = field.getKey();

            if ("userList".equals(key))
            {                   
                JsonNode users = field.getValue();

                if (users.isArray())
                {
                    for (Iterator<JsonNode> x = users.iterator(); x.hasNext();)
                    {
                        JsonNode entry = x.next();
                        if (entry.get("deleted").asBoolean())
                        {
                            System.out.println("Remove " + entry.get("firstName").asText() + " " + entry.get("lastName").asText());
                            x.remove();
                        }
                        else
                        {
                            System.out.println("Don't remove " + entry.get("firstName").asText() + " " + entry.get("lastName").asText());
                        }
                    }
                }
            }
        }

        Group grp = mapper.treeToValue(node, Group.class);
        System.out.println("Final group: " + grp);
    }
    catch (Exception e)
    {
        System.out.println("Something went wrong...");
        e.printStackTrace();
    }
}
Don't remove John Jones
Remove Jane Jones
Final group: Group [name=Test, id=1, userList=[User [firstName=John, lastName=Jones, deleted=false]]]
public class Answer28536024 {

@JsonDeserialize(using = GroupDeserializer.class)
public static class Group
{
   private String name;
   private int id;
   private List<User> userList;

   public Group()
   {
       userList = new ArrayList<User>();
   }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void addUser(User u)
    {
        userList.add(u);
    }

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "Group [name=" + name + ", id=" + id + ", userList=" + userList
                + "]";
    }      
}

public static class GroupDeserializer extends JsonDeserializer<Group>
{

    @Override
    public Group deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);

        Group group = new Group();
        group.setName(node.get("name").asText());
        group.setId(node.get("id").asInt());


        JsonNode users = node.get("userList");
        if (users.isArray())
        {
            for (JsonNode userNode : users)
            {
                if (!userNode.get("deleted").asBoolean())
                {
                    User user = new User();
                    user.setFirstName(userNode.get("firstName").asText());
                    user.setLastName(userNode.get("lastName").asText());
                    user.setDeleted(false);

                    group.addUser(user);
                }
            }
        }

        return group;
    }       
}


public static class User
{
   private String firstName;
   private String lastName;
   private boolean deleted;

   public User()
   {

   }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public boolean isDeleted() {
        return deleted;
    }

    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }

    @Override
    public String toString() {
        return "User [firstName=" + firstName + ", lastName=" + lastName
                + ", deleted=" + deleted + "]";
    }
}

public static void main(String[] args) 
{       
    Group g = new Group();
    g.setId(1);
    g.setName("Test");

    User u1 = new User();
    u1.setDeleted(false);
    u1.setFirstName("John");
    u1.setLastName("Jones");

    User u2 = new User();
    u2.setDeleted(true);
    u2.setFirstName("Jane");
    u2.setLastName("Jones");

    g.addUser(u1);
    g.addUser(u2);

    try
    {
        ObjectMapper mapper = new ObjectMapper();

        String jsonVal = mapper.writeValueAsString(g);
        System.out.println(jsonVal);

        Group grp = mapper.readValue(jsonVal, Group.class);
        System.out.println("Final group: " + grp);
    }
    catch (Exception e)
    {
        System.out.println("Something went wrong...");
        e.printStackTrace();
    }
}

}
{"name":"Test","id":1,"userList":[{"firstName":"John","lastName":"Jones","deleted":false},{"firstName":"Jane","lastName":"Jones","deleted":true}]}
Final group: Group [name=Test, id=1, userList=[User [firstName=John, lastName=Jones, deleted=false]]]