代码之家  ›  专栏  ›  技术社区  ›  Lolo

如何将Map作为json对象的属性之一来反序列化json对象

  •  0
  • Lolo  · 技术社区  · 13 年前

    我一直在使用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> ,测试定义如下?

    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反序列化为什么对象?有一件事我不能提前知道,那就是键的名称(示例中的键1、键2、键3)。

    1 回复  |  直到 13 年前
        1
  •  2
  •   StaxMan    13 年前

    它看起来是这样的:

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

    会的。唯一棘手的是 TypeReference ,这是传递泛型类型信息所必需的。其他库使用类似的方法(GSON TypeToken 或诸如此类)。