如何将json响应字段更改为java中的用户定义字段?

时间:2016-10-24 10:29:00

标签: java json jackson

我有以下json回复:

{
"Labels": {
                     "com.prop.vendor": "Acme",
                     "com.example.license": "GPL",
                     "com.example.version": "1.0"
             }
}

现在我想在我的java类中处理这些值。我遇到的问题是像 com.example.version 这样的字段,使用与数据类型相同的方式生成pojo。像,

private String com.example.version

这给了我编译时错误。 所以,我想创建一个字段" String版本"它指向" com.example.version" 我尝试过使用@JsonProperty和@JsonSetter。

Labels.java

public class Labels
{
    @JsonProperty("com.example.version")
    private String version;

    @JsonProperty("com.example.vendor")
    private String vendor;

    @JsonProperty("com.example.license")
    private String license;

    public String getVersion()
    {
        return version;
    }

    public void setVersion(String version)
    {
        this.version = version;
    }

    public String getVendor()
    {
        return vendor;
    }

    public void setVendor(String vendor)
    {
        this.vendor = vendor;
    }

    public String getLicense()
    {
        return license;
    }

    public void setLicense(String license)
    {
        this.license = license;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [com.example.version = " + version + ", com.example.vendor = " + vendor + ", com.example.license = "
                + license + "]";
    }
}

但每次我收到此错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Labels" (class com.csc.agility.adapters.service.docker.pojo.Labels), not marked as ignorable (3 known properties: "com.example.license", "com.example.vendor", "com.example.version"])
 at [Source: {
"Labels": {
                     "com.example.vendor": "Acme",
                     "com.example.license": "GPL",
                     "com.example.version": "1.0"
             }
}; line: 2, column: 12] (through reference chain: com.csc.agility.adapters.service.docker.pojo.Labels["Labels"])

我如何使用它:

ObjectMapper objMap = new ObjectMapper();
String jsonInString =
                "{\n\"Labels\": {\n                     \"com.example.vendor\": \"Acme\",\n                     \"com.example.license\": \"GPL\",\n                     \"com.example.version\": \"1.0\"\n             }\n}";

Label label = objMap.readValue(jsonInString, Label.class);
String licence = label.getLicense();

有人能指出我使用正确的json注释或以任何其他方式实现它吗?

2 个答案:

答案 0 :(得分:2)

您应该使用

配置mapper

mapper.configure(Feature.UNWRAP_ROOT_VALUE, true);(版本1.9)

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);(适用于版本2及更高版本)。

我已尝试过具有上述属性的json,一切正常:

String data = "{\"Labels\": {\"com.example.vendor\": \"Acme\",\"com.example.license\": \"GPL\",\"com.example.version\": \"1.0\"}}";

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
Labels labels = mapper.readValue(data, Labels.class);
System.out.println(labels);

注意:在Json字符串中,我已将com.prop.vendor更改为com.example.vendor以使其可用。

答案 1 :(得分:0)

还有一个像下面这样的pojo并使用此对象而不是标签来序列化/反序列化 -

public class Response {
 @JsonProperty("Labels")
 private Labels labels;
 //setter 
 //getter
}

在您的代码中使用此 -

Response response = objMap.readValue(jsonInString, Response.class);
String licence = response.getLabels().getLicense();