如何使用Jackson反序列化此JSON?

时间:2013-10-17 20:16:12

标签: java json jackson

我的json看起来像这样:

{
    "summary":{
        "somefield1":"somevalue1",
        "Twilio":{
            "field1":"value1",
            "field2":"value2"
        },
        "Tropo":{
            "field1":"value1",
            "field2":"value2"
        },
        ...
    }
}

我想将它反序列化为一个看起来像这样的java类:

public class Summary {
    private String someField1;
    private List<Vendor> vendors;
}

public class Vendor {
    private String name;
    private String field1;
    private String field2;
}

因此,Twilio和Tropo需要在Vendor.name ==“Twilio”或“Tropo”列表中成为Vendor对象。

我确信杰克逊拥有使用这种结构所需的工具,但我一直在寻找网络搜索。

3 个答案:

答案 0 :(得分:2)

您可以结合@JsonRootName@JsonAnySetter注释来完成此操作。您的Summary课程应如下所示:

@JsonRootName("summary")
class Summary {

    @JsonProperty("somefield1")
    private String someField1;
    private List<Vendor> vendors = new ArrayList<Vendor>();

    @JsonAnySetter
    public void setDynamicProperty(String vendorName, Map<String, String> properties) {
        Vendor vendor = new Vendor();
        vendor.setName(vendorName);
        vendor.setField1(properties.get("field1"));
        vendor.setField2(properties.get("field2"));

        vendors.add(vendor);
    }

    //getters,setters,toString methods

}

使用示例:

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

System.out.println(mapper.readValue(json, Summary.class));

上面的源代码显示了JSON的字符串:

Summary [someField1=somevalue1, vendors=[Vendor [name=Twilio, field1=value1, field2=value2], Vendor [name=Tropo, field1=value1, field2=value2]]]

答案 1 :(得分:1)

如果你想使用你的对象:

public class Summary {
    private String someField1;
    private List<Vendor> vendors;
}

public class Vendor {
    private String name;
    private String field1;
    private String field2;
}

你必须修改你的json。实际上,您定义的结构将转换为类似的结构:

{
"summary": {
    "somefield1": "somevalue1",
    "vendors": [
        {
            "name": "Twilio",
            "field1": "value1",
            "field2": "value2"
        },
        {
            "name": "Tropo",
            "field1": "value1",
            "field2": "value2"
        }
    ]
}

}

列表在方括号[]之间定义,在您的情况下,它是对象列表{}

如果可以,我会改变你的json,因为你发布的结构将是一个混乱的工作。我指出的那个与你的java对象匹配的那个更清楚。

答案 2 :(得分:0)

您获得的JSON结构将匹配此java结构,其中供应商的密钥是供应商名称。

public class Summary {
  private String someField1;
  private Map<String,Vendor> vendors;
}

public class Vendor {
  private String field1;
  private String field2;
}

您指定的类将支持此JSON:

{
    "somefield1":"somevalue1",
    "vendors":[{
        "name":"Twilio"
        "field1":"value1",
        "field2":"value2"
    },
    {
        "name":"Tropo"
        "field1":"value1",
        "field2":"value2"
    },
    ...]

}

我认为你不能用杰克逊实现你想要的东西,因为名字在“供应商”对象之外。