Подтвердить что ты не робот

Jackson Json Deserialisation: непризнанное поле "...", не обозначенное как невежественное

Я получаю следующую ошибку, и ни одно из найденных мной решений не помогло мне:

Нераспознанное поле "GaugeDeviceId" (класс GaugeDevice), не помеченное как игнорируемое

Кажется, проблема в том, что служба возвращает имена свойств с первой заглавной буквы, а свойства класса начинаются со строчной буквы.

Я старался:

  1. изменение propertyNames на первую заглавную букву - та же ошибка
  2. добавление @JsonProperty("SerialNo") к экземпляру свойства - та же ошибка
  3. добавление @JsonProperty("SerialNo") к соответствующим геттерам - та же ошибка
  4. добавление @JsonProperty("SerialNo") к соответствующим установщикам - та же ошибка
  5. добавление @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);
    }
}

Я надеюсь, что ошибка имеет корень здесь?

4b9b3361

Ответ 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

Решение, которое сработало для меня, заключается в следующем

  1. Добавить импорт

    import org.codehaus.jackson.map.DeserializationConfig;
    
  2. Настройте ObjectMapper

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
    
  3. Полное решение

    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;