Ignorowanie nowych pól na obiektach JSON za pomocą Jacksona

Używam Biblioteki Jackson JSON do konwersji niektórych obiektów JSON do klas POJO w aplikacji na Androida. Problem polega na tym, że obiekty JSON mogą się zmieniać i dodawać nowe pola podczas publikowania aplikacji, ale obecnie pęknie nawet po dodaniu prostego pola tekstowego, które można bezpiecznie zignorować.

Czy Jest jakiś sposób, aby powiedzieć Jacksonowi, aby ignorował nowo dodane pola? (np. nieistniejące na obiektach POJO)? Globalne ignorowanie byłoby świetne.

Author: mathk, 2011-03-28

12 answers

Jackson dostarcza adnotację, która może być używana na poziomie klasy (JsonIgnoreProperties ).

Dodaj do góry swojej klasy ( a nie do poszczególnych metod):

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo {
    ...
}

W zależności od używanej wersji musisz użyć innego importu w bieżącej wersji jest to:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

W starszych wersjach było:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
 724
Author: Hadi Eskandari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-10 13:12:51

Oprócz dwóch wspomnianych już mechanizmów 2, Istnieje również funkcja globalna, która może być używana do tłumienia wszystkich awarii spowodowanych przez nieznane (niemapowane) właściwości:

// jackson 1.9 and before
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// or jackson 2.0
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Jest to wartość domyślna używana przy braku adnotacji i może być wygodnym rozwiązaniem awaryjnym.

 378
Author: StaxMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-25 16:31:12

Up to date and complete answer with Jackson 2


Używanie Adnotacji

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyMappingClass {

}

Zobacz JsonIgnoreProperties na dokumentacji Jackson online.

Korzystanie Z Konfiguracji

Mniej natrętne niż adnotacja.

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

ObjectReader objectReader = objectMapper.reader(MyMappingClass.class);
MyMappingClass myMappingClass = objectReader.readValue(json);

ZobaczFAIL_ON_UNKNOWN_PROPERTIES na dokumentacji Jackson online.

 94
Author: Yves M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-08 06:27:05

Można to osiągnąć na 2 sposoby:

  1. Zaznacz POJO, aby zignorować nieznane właściwości

    @JsonIgnoreProperties(ignoreUnknown = true)
    
  2. Konfiguracja ObjectMapper, który serializuje / De-serializuje POJO / json jak poniżej:

    ObjectMapper mapper =new ObjectMapper();            
    // for Jackson version 1.X        
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // for Jackson version 2.X
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
    
 49
Author: Amit Kaneria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 19:37:14

Jeśli używasz klasy pojo opartej na odpowiedzi JSON. Jeśli istnieją szanse, że json zmienia się często na poziomie klasy pojo:

@JsonIgnoreProperties(ignoreUnknown = true)

I w objectMapper dodaj to jeśli konwertujesz:

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Aby ten kod nie pękł.

 23
Author: user5636084,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-03 19:57:12

Upewnij się, że umieścisz adnotację @JsonIgnoreProperties(ignoreUnknown = true) do nadrzędnej klasy POJO, którą chcesz wypełnić w wyniku parsowania odpowiedzi JSON, a nie klasy, w której odbywa się konwersja z JSON do obiektu Java.

 17
Author: Rushi Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-16 13:38:20

Począwszy od wersji Jacksona 2.4 i wyżej zaszły pewne zmiany. Oto jak to teraz robisz:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

..........................................................................

 ObjectMapper mapper = new ObjectMapper();
    // to prevent exception when encountering unknown property:
 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

Uwaga: rozwiązanie oparte na adnotacji @pozostaje takie samo, więc jeśli chcesz go użyć, zobacz inne odpowiedzi.

For more information see the 10 minutes Configuration tutorial at: https://github.com/FasterXML/jackson-databind

 14
Author: Alboz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-06 10:28:05

Jak wspomniano powyżej, adnotacje działają tylko wtedy, gdy jest to określone w nadrzędnej klasie POJO, a nie klasie, w której odbywa się konwersja z JSON do obiektu Java.

Inną alternatywą bez dotykania klasy nadrzędnej i powodowania zakłóceń jest zaimplementowanie własnego konfiguratora mapper tylko dla metod mapper, których do tego potrzebujesz.

Również pakiet funkcji deserializacji został przeniesiony. DeserializationConfig.FAIL_ON_UNKNOWN_PROPERTIES na DeserializationConfig.Cecha.FAIL_ON_UNKNOWN_PROPERTIES

import org.codehaus.jackson.map.DeserializationConfig;
...
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 10
Author: mekdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-26 18:49:49

@JsonIgnoreProperties(ignoreUnknown = true) dobrze mi poszło. Mam aplikację java, która działa na tomcat z jdk 1.7.

 9
Author: Parul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 17:07:03

Używam jackson-xxx 2.8.5.Maven Dependency like:

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.5</version>
    </dependency>

</dependencies>

Po pierwsze, jeśli chcesz zignorować nieznane właściwości globalnie.możesz skonfigurować ObjectMapper.
Jak poniżej:

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Jeśli chcesz zignorować jakąś klasę, możesz dodać adnotację @JsonIgnoreProperties(ignoreUnknown = true) na swojej klasie jak:

@JsonIgnoreProperties(ignoreUnknown = true)
public class E1 {

    private String t1;

    public String getT1() {
        return t1;
    }

    public void setT1(String t1) {
        this.t1 = t1;
    }
}
 7
Author: inOut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-20 02:57:11

Dla kogo używasz Spring Boot, możesz skonfigurować domyślne zachowanie Jacksona za pomocą Jackson2ObjectMapperBuilder.

Na przykład:

@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
    Jackson2ObjectMapperBuilder oMapper = new Jackson2ObjectMapperBuilder();
    oMapper.failOnUnknownProperties(false);
    return oMapper;
}

Następnie możesz autowireować ObjectMapper wszędzie, gdzie jest to potrzebne (domyślnie ten obiekt mapper będzie również używany do konwersji zawartości http).

 0
Author: Thoomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 12:44:55

Możesz dodać adnotację do konkretnej właściwości w swoim POJO za pomocą @JsonIgnore.

 -2
Author: Prasanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-28 14:53:17