Jackson Json Deserialisation: непризнанное поле "...", не обозначенное как невежественное
Я получаю следующую ошибку, и ни одно из найденных мной решений не помогло мне:
Нераспознанное поле "GaugeDeviceId" (класс GaugeDevice), не помеченное как игнорируемое
Кажется, проблема в том, что служба возвращает имена свойств с первой заглавной буквы, а свойства класса начинаются со строчной буквы.
Я старался:
- изменение propertyNames на первую заглавную букву - та же ошибка
- добавление
@JsonProperty("SerialNo")
к экземпляру свойства - та же ошибка - добавление
@JsonProperty("SerialNo")
к соответствующим геттерам - та же ошибка - добавление
@JsonProperty("SerialNo")
к соответствующим установщикам - та же ошибка - добавление
@JsonProperty("SerialNo")
ко всем из них (просто для удовольствия) - та же ошибка
(примечание: @JsonProperty("SerialNo")
является лишь примером)
Странно то, что аннотация: @JsonIgnoreProperties(ignoreUnknown = true)
должна подавлять именно эту ошибку, но она все еще срабатывает...
здесь класс: (примечание: не завершено)
@JsonIgnoreProperties(ignoreUnknown = true)
public class GaugeDevice
{
private int gaugeDeviceId;
private Date utcInstallation;
private String manufacturer;
private float valueOffset;
private String serialNo;
private String comment;
private int digitCount;
private int decimalPlaces;
@JsonProperty("SerialNo")
public String getSerialNo() {
return serialNo;
}
public void setSerialNo(String serialNo) {
this.serialNo = serialNo;
}
@JsonProperty("Comment")
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
Где здесь выход? Пожалуйста помоги.
редактировать:
Вот класс клиента: (просто простой тестовый клиент)
import ccc.android.meterdata.*;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import org.glassfish.jersey.jackson.JacksonFeature;
public class RestClient
{
private String connectionUrl;
private javax.ws.rs.client.Client client;
public RestClient(String baseUrl) {
client = ClientBuilder.newClient();;
connectionUrl = baseUrl;
client.register(JacksonFeature.class);
}
public GaugeDevice GetGaugeDevice(int id){
String uri = connectionUrl + "/GetGaugeDevice/" + id;
Invocation.Builder bldr = client.target(uri).request("application/json");
return bldr.get(GaugeDevice.class);
}
}
Я надеюсь, что ошибка имеет корень здесь?
Ответы
Ответ 1
Еще одна вещь, которую нужно проверить, - это PropertyNamingStrategy
, которая позволит Джексону использовать "Именование Pascal" и сопоставить свойства JSON с свойствами POJO. См. F.ex здесь: http://www.javacodegeeks.com/2013/04/how-to-use-propertynamingstrategy-in-jackson.html
Ответ 2
У меня была такая же проблема, и я разрешил ее, изменив импорт аннотации:
com.fasterxml.jackson.annotation.JsonIgnoreProperties
to
org.codehaus.jackson.annotate.JsonIgnoreProperties
Не нужно было определять какую-либо NamingStrategy или ObjectMapper.
Ответ 3
У меня была такая же проблема и она была решена путем изменения импорта аннотации из
com.fasterxml.jackson.annotation.JsonProperty
to
org.codehaus.jackson.annotate.JsonProperty
Ответ 4
Учитывая следующее, ваша ошибка:
Нераспознанное поле "GaugeDeviceId" (Class GaugeDevice), не помеченное как невежественное
Я уверен, что вам нужно сделать то же самое для свойства GaugeDeviceId
, как вы это сделали для свойства SerialNo
.
@JsonProperty("SerialNo")
public String getSerialNo() {
return this.serialNo;
}
@JsonProperty("GaugeDeviceId")
public int getGaugeDeviceId() {
return this.gaugeDeviceId;
}
Здесь у меня есть быстрый тестовый класс, который не бросает ошибки.
import org.codehaus.jackson.map.ObjectMapper;
public class JsonDeserialization {
public static void main(final String[] args) {
final String json = "{ \"SerialNo\":\"123\", \"GaugeDeviceId\":\"456\"}";
final ObjectMapper mapper = new ObjectMapper();
try {
final GaugeDevice readValue = mapper.readValue(json, GaugeDevice.class);
System.out.println(readValue.getSerialNo());
System.out.println(readValue.getGaugeDeviceId());
} catch (final Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
И он выводит:
123
456
EDIT: информация о версии
Не то, чтобы это было важно, так как я считаю, что все это использует некоторые довольно стандартные материалы от Jackson, я использую версию 1.9.13 core-asl и mapper-asl.
РЕДАКТИРОВАТЬ: Клиент предоставлен
Интересно, связано ли это с этой проблемой? Я считаю, что разрешение - это конфигурация зависимостей, которые вы используете.
Я не уверен, но мне кажется, что я близок к следующей настройке зависимостей (обратите внимание, что я использую maven)
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-processing</artifactId>
<version>2.0</version>
</dependency>
Эти ссылки предоставили информацию о конфигурации: Ссылка 1, Ссылка 2
Ответ 5
Вы можете игнорировать неизвестные свойства при десериализации, используя аннотацию на уровне класса.
Например:
@JsonIgnoreProperties(ignoreUnknown=true)
class Foo{
...
}
Вышеприведенный фрагмент игнорирует любые неизвестные свойства.
(Импорт аннотации: org.codehaus.jackson.annotate.JsonIgnoreProperties)
Ответ 6
Решение, которое сработало для меня, заключается в следующем
-
Добавить импорт
import org.codehaus.jackson.map.DeserializationConfig;
-
Настройте ObjectMapper
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
-
Полное решение
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
String jsonInString = objectMapper.writeValueAsString(eje);
Eje newElement = objectMapper.readValue(jsonInString, Eje.class);
this.eje = newElement;