繁体   English   中英

在Java中使用杰克逊注释反序列化字符串和对象

[英]Deserialize strings and objects using jackson annotations in java

我当前的json文件如下所示:

{
  "root": {
    "node1a":[
    ],
    "node1b":[
      "foo",
      "bar"
    ]
  }
}

和杰克逊反序列化:

@JsonCreator
class DeserializationClass{

    Map<String, List<String>> nodes;

    DeserializationClass(@JsonProperty("root") final Map<String, List<String>> nodes) {
        this.nodes = nodes;
    }
}

但是,我想转到一种结构,例如

{
  "root": {
    "node1a":[
    ],
    "node1b":[
      "foo",
      "bar",
      {
        "key1":"value",
        "key2":"value"
      }
    ]
  }
}

是否可以通过替换使用注释来反序列化:

Map<String, List<String>> 

Map<String, List<AnotherClass>>?

现在,您的node1b是对象的混合数组,因此,除非要实现完整的自定义反序列化器,否则,您可以获得的最佳效果是List<Object> ,其中某些对象将是Map

您可以使用JsonCreator批注和POJO项目的两个构造函数。 如果数组中有一个原语,将使用1-arg构造函数。 对于完全设置的对象,将使用2-arg构造函数。 看下面的例子:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper.readValue(jsonFile, DeserializationClass.class));
    }
}


class DeserializationClass {

    Map<String, List<AnotherClass>> nodes;

    @JsonCreator
    DeserializationClass(@JsonProperty("root") final Map<String, List<AnotherClass>> nodes) {
        this.nodes = nodes;
    }

    @Override
    public String toString() {
        return "DeserializationClass{" +
                "nodes=" + nodes +
                '}';
    }
}

class AnotherClass {

    private String key1;
    private String key2;

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public AnotherClass(@JsonProperty("key1") String value) {
        this(value, null);
    }

    @JsonCreator
    public AnotherClass(@JsonProperty("key1") String key1, @JsonProperty("key2") String key2) {
        this.key1 = key1;
        this.key2 = key2;
    }

    @Override
    public String toString() {
        return "AnotherClass{" +
                "key1='" + key1 + '\'' +
                ", key2='" + key2 + '\'' +
                '}';
    }
}

哪个为您的JSON有效负载打印:

DeserializationClass{nodes={node1a=[], node1b=[AnotherClass{key1='foo', key2='null'}, AnotherClass{key1='bar', key2='null'}, AnotherClass{key1='value1', key2='value1'}]}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM