Jackson和Iterable:如何反序列化

leeyuiwah:

我有一个类Box,它具有一个实现elements类型的字段(请参见下面的代码)。后者包含也称为ElementsIterableListelements

如果我设置字段elementsElementsprivate,那么系列化只会把它作为一个数组,而不是一个POJO

由版本A完成的序列化

{
  "elements" : [ "a", "b", "c" ]
}

但是,我无法反序列化此字符串。错误是:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `ser_deser_test.Elements` out of START_ARRAY token
 at [Source: (String)"{
  "elements" : [ "a", "b", "c" ]
}"; line: 2, column: 16] (through reference chain: 

相反,如果将I设置elementspublic,则elementsof Box将被视为POJO,并且其中有两个有趣的层次elements但是,反序列化在这种情况下有效。

版本B的序列化

{
  "elements" : {
    "elements" : [ "a", "b", "c" ]
  }
}

我的问题是:如何获得反序列化才能用于版本A?

Box.java

package ser_deser_test;

public class Box {
    public Box() {
        super();
    }

    public Elements elements;

    public Box(Elements elements) {
        super();
        this.elements = elements;
    }

}

Elements.java

package ser_deser_test;

import java.util.Iterator;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonFormat;

public class Elements implements Iterable<String> {
    // private List<String> elements; // Version A
    // public List<String> elements;  // Version B

    public Elements() {
        super();
    }

    public Elements(List<String> elements) {
        super();
        this.elements = elements;
    }

    @Override
    public Iterator<String> iterator() {
        return elements.iterator();
    }

}

TestSerDeser.java

package ser_deser_test;

import java.io.IOException;
import java.util.Arrays;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class TestSerDeser {

    public static void main(String[] args) {
        Elements elements = new Elements(Arrays.asList("a", "b", "c"));
        Box      box = new Box(elements);

        ObjectMapper om = new ObjectMapper();

        om.enable(SerializationFeature.INDENT_OUTPUT);
        try {
            // Serialize
            String s = om.writeValueAsString(box);

            // Deserialize
            Box box2 = om.readValue(s, Box.class);

            boolean dummy = false;

        } catch (JsonProcessingException e2) {
            e2.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }         
    }
}
user10639668:

您的代码可以在以下情况下正常工作:

package ser_deser_test;

import java.util.Iterator;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonFormat;

public class Elements implements Iterable<String> {
    // private List<String> elements; // Version A
    public List<String> elements;  // Version B

    public Elements() {
        super();
    }

    public Elements(List<String> elements) {
        super();
        this.elements = elements;
    }

    @Override
    public Iterator<String> iterator() {
        return elements.iterator();
    }

}

并失败,Version A因为默认情况下,杰克逊(Jackson)没有访问私有字段的权限,因此失败要使其与Version A修改TestSerDeser类一起使用,如下所示:

ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

为了使Jackson可以访问私有字段List<String> elements,甚至更好的是,为此字段添加一个公共getter。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Jackson序列化和反序列化对象列表

Jackson:反序列化和序列化后如何检测修改的对象?

如何使用Jackson将Java Enums序列化和反序列化为JSON对象

如何序列化和反序列化 Hashtable?

如何使用Jackson API在序列化和反序列化上使用不同的JSONProperty?

用Jackson和@JsonCreator反序列化JSON

使用Jackson和Lombok反序列化ImmutableList

使用Jersey和Jackson进行Map的序列化和反序列化

如何使用Java和Jackson库对Json String进行多态反序列化?

如何使用Jackson将反序列化的JSON反序列化为忽略键的对象?

如何使用Jackson的objectMapper反序列化接口字段?

如何用Jackson反序列化Map <?,?>?

如何用Jackson反序列化通用List <T>?

如何使用Jackson来反序列化对象变量?

我如何反序列化Jackson的秒数时间戳?

如何使用Jackson来反序列化对象数组

如何使用Jackson来反序列化JS日期?

使用Jackson将针对JAVA类的JSON序列化和反序列化

用Jackson序列化和反序列化Lambda

Spring Boot-Jackson日期序列化和反序列化

使用Jackson序列化和反序列化任意值

Jackson和java.sql.Time序列化/反序列化

Jackson序列化和反序列化没有双引号的对象

使用Jackson JSON是否可以进行非对称序列化和反序列化?

序列化和反序列化具有相同名称的Jackson XML元素

使用Jackson的非对称序列化和反序列化

Jackson枚举序列化和反序列化器

序列化和反序列化Map <Object,Object> Jackson

HashMap <MyObject,List <Integer>与Jackson的序列化和反序列化