У меня есть следующий ответ 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 для использования или любой другой способ ее достижения?
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
, чтобы сделать его работоспособным.
Сделайте еще одно pojo, как показано ниже, и используйте этот объект вместо Labels для сериализации / десериализации -
public class Response {
@JsonProperty("Labels")
private Labels labels;
//setter
//getter
}
В вашем коде используйте это -
Response response = objMap.readValue(jsonInString, Response.class);
String licence = response.getLabels().getLicense();
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.