У меня есть следующий ответ 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

Что дает мне ошибки времени компиляции. Итак, я хочу создать поле «Версия строки», которое указывает на «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 для использования или любой другой способ ее достижения?

3
Siddharth 24 Окт 2016 в 13:28

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 String я изменил com.prop.vendor на com.example.vendor, чтобы сделать его работоспособным.

2
Sachin Gupta 24 Окт 2016 в 10:50

Сделайте еще одно pojo, как показано ниже, и используйте этот объект вместо Labels для сериализации / десериализации -

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

В вашем коде используйте это -

Response response = objMap.readValue(jsonInString, Response.class);
String licence = response.getLabels().getLicense();
0
Freelancer 24 Окт 2016 в 10:35