Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 objectmapper以正确地反序列化到pojo?_Java_Deserialization_Jackson - Fatal编程技术网

Java 如何配置jackson objectmapper以正确地反序列化到pojo?

Java 如何配置jackson objectmapper以正确地反序列化到pojo?,java,deserialization,jackson,Java,Deserialization,Jackson,我在理解反序列化时应该如何配置objectMapper和pojo时遇到了一些问题。我的Json是由另一个 支持xml和json。它返回一个带有myobject的列表,但Json包含该类型,如下所示: [ { "myobject": { "somethingcool": "amazing", "contactPersonsForMyObject": [ "test.test@gmail.com"

我在理解反序列化时应该如何配置objectMapper和pojo时遇到了一些问题。我的Json是由另一个 支持xml和json。它返回一个带有myobject的列表,但Json包含该类型,如下所示:

[
    {
        "myobject": {
            "somethingcool": "amazing",
            "contactPersonsForMyObject": [
                "test.test@gmail.com",
                "test@test.se"
            ],
            "myObjectId": "c85e48730501bfae41e67714c6131b7d"
        }
    },
    {
        "myobject": {
            "somethingcool": "cool",
            "contactPersonsForMyObject": [
                "test.test2@gmail.com",
                "test@test2.se"
            ],
            "myObjectId": "c85e48730501bfae41e67714cqwerty"
        }
    }
]
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<List<Map<String, MyObject>>>() {
        });
我的班级:

public class MyObject {

    private String myObjectId;
    private String somethingcool;
    private List<String> contactPersonsForMyObject;

    public String getMyObjectId() {
        return myObjectId;
    }

    public void setMyObjectId(String myObjectId) {
        this.myObjectId = myObjectId;
    }

    public String getSomethingcool() {
        return somethingcool;
    }

    public void setSomethingcool(String somethingcool) {
        this.somethingcool = somethingcool;
    }

    public List<String> getContactPersonsForMyObject() {
        return contactPersonsForMyObject;
    }

    public void setContactPersonsForMyObject(List<String> contactPersonsForMyObject) {
        this.contactPersonsForMyObject = contactPersonsForMyObject;
    }
}
这就像地图绘制者不理解额外的“层”。 当序列化以获取此结构时,可以如下配置映射器:
mapper.configure(SerializationConfig.Feature.WRAP\u ROOT\u VALUE,true)

那么应该有什么方法来做相反的事情


谢谢大家!

您需要对类型(类)使用
@JsonTypeInfo
注释,该注释将包括其他类型信息。在您的例子中,似乎希望包含一个类型id作为属性键


如果是这样,包含方法应该是“作为包装器对象”,并且您还需要定义“myobject”绑定到的类型id——这可以通过为
myobject
类添加
@JsonTypeName(“myobject”)
来完成(它需要包含在任何具有
@JsonTypeInfo
的子类型中,但在本例中,这两个都将被添加到同一个类中)。

您的json有一个额外的嵌套级别:您有一个到MyObject的字符串映射列表,而不是一个MyObject列表。您需要这样阅读它:

[
    {
        "myobject": {
            "somethingcool": "amazing",
            "contactPersonsForMyObject": [
                "test.test@gmail.com",
                "test@test.se"
            ],
            "myObjectId": "c85e48730501bfae41e67714c6131b7d"
        }
    },
    {
        "myobject": {
            "somethingcool": "cool",
            "contactPersonsForMyObject": [
                "test.test2@gmail.com",
                "test@test2.se"
            ],
            "myObjectId": "c85e48730501bfae41e67714cqwerty"
        }
    }
]
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<List<Map<String, MyObject>>>() {
        });
List myObjects=mapper.readValue(json,新类型引用(){
});
或者将生成此json的内容更改为放弃内部映射(IMHO更好)。

List
更改为
ArrayList
然后

将以下构造函数添加到
MyObject

@JsonCreator
public MyObject(@JsonProperty("myObjectId") String myObjectId,
             @JsonProperty("somethingcool") String somthingcool,
             @JsonProperty("contact") ArrayList<String> contactPersonsForMyObject) {

   this.myObjectID = myObjectId;
   this.somethingcool = somethingcool;
   this.contactPersonsForMyObject = contactPersonsForMyObject;    
}
@JsonCreator
公共MyObject(@JsonProperty(“myObjectId”)字符串myObjectId,
@JsonProperty(“somethingcool”)字符串somthingcool,
@JsonProperty(“联系人”)ArrayList ContactPersonFormyObject){
this.myObjectID=myObjectID;
this.somethingcool=somethingcool;
this.contactPersonsForMyObject=contactPersonsForMyObject;
}

并将getter的返回值更改为ArrayList,您需要给它具体的类而不是接口

List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<ArrayList<HashMap<String, MyObject>>>() {
        });
List myObjects=mapper.readValue(json,新类型引用(){
});

请您详细说明您的答案,也许是一些代码示例?我发现这方面的文档很难理解。您可能想在jackson用户列表中询问这一点;此外,Google可以找到合适的文章(从fasterxml jackson wiki、cowtowncoder.com博客),如果@JsonTypeInfo的javadocs不够清晰。1.是的,我知道,您的示例就像实现一个包装器。这不是我想要做的。2.我不能放弃内部映射,因为我没有对应用程序的控制权
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<ArrayList<HashMap<String, MyObject>>>() {
        });