【问题标题】:How do deserialize a json object with a Map as one of its properties如何以 Map 作为其属性之一反序列化 json 对象
【发布时间】:2012-09-27 20:29:01
【问题描述】:

我一直在使用 jackson 成功地反序列化 json 对象和数组,但这次我无法理解如何处理以下对象的反序列化。如何使用 Jackson 或任何其他 json 解析库反序列化:

 [
    {
        "name": "x",
        "elements": {
            "key1": {
                "name": "a",
                "type": "b"
            },
            "key2": {
                "name": "a",
                "type": "b"
            }
        }
    },
    {
        "name": "y",
        "elements": {
            "key3": {
                "name": "a",
                "type": "b"
            }
        }
    }
 ]

进入列表List<Test>,下面定义了Test?

public class Test {     
    public class Element {
        public String name;
        public String type;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
    }
    public String name;
    public Map<String, Element> elements;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Map<String, Element> getElements() {
        return elements;
    }
    public void setElements(Map<String, Element> elements) {
        this.elements = elements;
    }  
} 

最后,我的反序列化代码:

  public List<Test> test(final InputStream inputStream) {
    List<Test> test = null;
    try {
      test = mapper.readValue(inputStream, new TypeReference<List<Test>>() { });
    }  catch (final IOException e) {
      log.error("Unable to deserialize json",e);
    }
    return test;
  }

如果这不可能,我实际上可以将我的 json 反序列化为什么对象?我无法提前知道的一件事是键的名称(示例中为 key1、key2、key3)。

【问题讨论】:

    标签: json jackson deserialization


    【解决方案1】:

    看起来像这样:

    ObjectMapper mapper = new ObjectMapper();
    List<Test> tests = mapper.readValue(jsonInput, new TypeReference<List<Test>>() { };
    

    会的。唯一棘手的部分是TypeReference,它是传递泛型类型信息所必需的。其他库使用类似的方法(GSON 有 TypeToken 等)。

    【讨论】:

    • 不幸的是,采用这种方法会返回一个空指针(不会产生异常)。如果我从我的 json 数组中删除“元素”,那么测试的大小正确为 2,两个条目的元素 = null (如预期的那样)。
    • 多田!!!问题在于 Element 是 Test 中的一个公共类。我改为在单独的文件中创建了一个类 Element 并且它起作用了。谢谢。我真的必须更好地理解这个 TypeReference。
    • 啊。非静态内部类可能有问题,因为它们需要外部类的实例(“隐式父 'this' 指针”)。所以通常使用的内部类定义为static
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    相关资源
    最近更新 更多