Muszę przekonwertować określony ciąg JSON na obiekt Java. Używam Jacksona do obsługi JSON. Nie mam kontroli nad wejściem JSON (czytam z serwisu internetowego). Oto moje dane wejściowe JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
Oto uproszczony przypadek użycia:
private void tryReading() {
String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = null;
try {
wrapper = mapper.readValue(jsonStr , Wrapper.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("wrapper = " + wrapper);
}
Moja klasa jednostek to:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Moja klasa Wrapper to w zasadzie obiekt kontenerowy, za pomocą którego otrzymuję moją listę uczniów:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Ciągle pojawia się ten błąd i „otoki” powraca null
. Nie jestem pewien, czego brakuje. Czy ktoś może pomóc?
org.codehaus.jackson.map.exc.UnrecognizedPropertyException:
Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
at [Source: java.io.StringReader@1198891; line: 1, column: 13]
(through reference chain: Wrapper["wrapper"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
.from(UnrecognizedPropertyException.java:53)
java
json
data-binding
jackson
jshree
źródło
źródło
Map dummy<String,Student> = myClientResponse.getEntity(new GenericType<Map<String, Student>>(){});
a następnieStudent myStudent = dummy.get("wrapper");
Odpowiedzi:
Możesz użyć adnotacji Jacksona na poziomie klasy:
Zignoruje każdą właściwość, której nie zdefiniowałeś w swoim POJO. Bardzo przydatne, gdy szukasz tylko kilku właściwości w JSON i nie chcesz pisać całego mapowania. Więcej informacji na stronie Jacksona . Jeśli chcesz zignorować dowolną niezadeklarowaną właściwość, napisz:
źródło
(ignoreUnknown = true)
adnotacji do swojej klasy, bo inaczej to nie zadziałaMożesz użyć
Zignoruje wszystkie właściwości, które nie zostały zadeklarowane.
źródło
Pierwsza odpowiedź jest prawie poprawna, ale potrzebna jest zmiana metody pobierającej, NIE pole - pole jest prywatne (i nie jest automatycznie wykrywane); ponadto, gettery mają pierwszeństwo przed polami, jeśli oba są widoczne. (Istnieją również sposoby, aby pola prywatne były widoczne, ale jeśli chcesz mieć getter, nie ma większego sensu)
Więc getter powinien zostać nazwany
getWrapper()
lub opatrzony adnotacjami:Jeśli wolisz nazwę metody pobierającej taką, jaka jest.
źródło
@JsonProperty
. Chociaż@JsonGetter
jest to prawny pseudonim, rzadko jest używany jako narzędzie@JsonProperty
dla pobierających, ustawiających i pól; setery i gettery można rozróżnić na podstawie podpisu (jeden nie przyjmuje żadnych argumentów, zwraca nie-void; drugi przyjmuje jeden argument).używając Jackson 2.6.0, to zadziałało dla mnie:
i z ustawieniem:
źródło
ObjectMapper
, aby ustawićFAIL_ON_UNKNOWN_PROPERTIES
właściwość globalnie.można to osiągnąć na 2 sposoby:
Zaznacz POJO, aby zignorować nieznane właściwości
Skonfiguruj ObjectMapper, który serializuje / odserializowuje POJO / json, jak poniżej:
źródło
To po prostu doskonale działało dla mnie
@JsonIgnoreProperties(ignoreUnknown = true)
adnotacja nie.źródło
Wrapper
instancję, w której lista studentów jestnull
pusta.Działa to lepiej niż Wszystkie, zapoznaj się z tą właściwością.
źródło
Jeśli korzystasz z Jackson 2.0
źródło
Zgodnie z dokumentem możesz zignorować wybrane pola lub wszystkie pola nieznane:
źródło
Działa dla mnie z następującym kodem:
źródło
Dodanie seterów i getterów rozwiązało problem , czułem, że rzeczywistym problemem jest to, jak go rozwiązać, ale nie jak pomijać / ignorować błąd. Pojawił się błąd „ Pole nierozpoznane… nie oznaczone jako ignorowalne… ”
Chociaż używam poniższej adnotacji na szczycie klasy, nie było w stanie przeanalizować obiektu json i podać danych wejściowych
Potem zdałem sobie sprawę, że nie dodałem seterów i getterów, po dodaniu seterów i getterów do „Wrapper” i do „Student” działało to jak urok.
źródło
Jackson narzeka, ponieważ nie może znaleźć pola w twojej klasie Wrapper, które nazywa się „wrapper”. Robi to, ponieważ obiekt JSON ma właściwość o nazwie „wrapper”.
Myślę, że poprawką jest zmiana nazwy pola klasy Wrapper na „wrapper” zamiast „student”.
źródło
Wypróbowałem poniższą metodę i działa ona z takim odczytem formatu JSON z Jacksonem. Skorzystaj z już sugerowanego rozwiązania: adnotacji gettera za pomocą
@JsonProperty("wrapper")
Twoja klasa opakowania
Moja propozycja klasy opakowania
Dałoby to jednak wynik formatu:
Aby uzyskać więcej informacji, zobacz https://github.com/FasterXML/jackson-annotations
Mam nadzieję że to pomoże
źródło
{}
symboli na pasku narzędzi, aby sformatować fragmenty kodu.To rozwiązanie jest ogólne podczas odczytywania strumieni Json i wymaga tylko niektórych pól, a pola niepoprawnie zmapowane w klasach domeny można zignorować:
Szczegółowym rozwiązaniem byłoby użycie narzędzia takiego jak jsonschema2pojo do automatycznego generowania wymaganych klas domen, takich jak Student ze schematu odpowiedzi json. Możesz to zrobić za pomocą dowolnego internetowego konwertera json na schemat.
źródło
Opisz adnotacje uczniom terenowym, jak poniżej, ponieważ istnieje niedopasowanie w nazwach właściwości json i własności Java
źródło
Jak nikt inny nie wspomniał, myślałem, że ...
Problem polega na tym, że twoja własność w twoim JSON nazywa się „wrapper”, a twoja własność w Wrapper.class nazywa się „studentami”.
Więc albo ...
źródło
Zestaw publiczny wasze pola klasy nie prywatny .
źródło
To, co zadziałało, to upublicznienie nieruchomości. To rozwiązało problem dla mnie.
źródło
Albo zmień
do
---- lub ----
Zmień ciąg JSON na
źródło
Twój wkład
wskazuje, że jest to Obiekt z polem o nazwie „opakowanie”, który jest Kolekcją Studentów. Więc moim zaleceniem byłoby
gdzie
Wrapper
jest zdefiniowany jakoźródło
Nowy Firebase Android wprowadził ogromne zmiany; poniżej kopii dokumentu:
[ https://firebase.google.com/support/guides/firebase-android] :
Zaktualizuj obiekty modelu Java
Podobnie jak w przypadku zestawu SDK 2.x, Firebase Database automatycznie przekonwertuje obiekty Java, które przekazujesz
DatabaseReference.setValue()
na JSON i może czytać JSON na obiekty Java za pomocąDataSnapshot.getValue()
.W nowym zestawie SDK podczas odczytywania JSON do obiektu Java za pomocą
DataSnapshot.getValue()
nieznanych właściwości w JSON są teraz domyślnie ignorowane, więc nie jest już potrzebne@JsonIgnoreExtraProperties(ignoreUnknown=true)
.Aby wykluczyć pola / gettery podczas zapisywania obiektu Java w JSON, adnotacja jest teraz wywoływana
@Exclude
zamiast@JsonIgnore
.Jeśli w twoim JSON istnieje dodatkowa właściwość, która nie znajduje się w twojej klasie Java, zobaczysz to ostrzeżenie w plikach dziennika:
Możesz pozbyć się tego ostrzeżenia, umieszczając
@IgnoreExtraProperties
adnotację na swojej klasie. Jeśli chcesz, aby Firebase Database zachowywała się tak, jak miało to miejsce w zestawie SDK 2.x i zgłasza wyjątek, jeśli istnieją nieznane właściwości, możesz umieścić@ThrowOnExtraProperties
adnotację na swojej klasie.źródło
Z mojej strony jedyna linia
@JsonIgnoreProperties(ignoreUnknown = true)
też nie działał.
Poprostu dodaj
Jackson 2.4.0
źródło
To działało idealnie dla mnie
źródło
Rozwiązałem ten problem, po prostu zmieniając podpisy mojego setera i metody pobierające mojej klasy POJO. Wszystko, co musiałem zrobić, to zmienić getObject metodę , tak aby pasowała do tego, czego szukał program mapujący. W moim przypadku miałem getImageUrl oryginalnie, ale dane JSON miał IMAGE_URL który rzuca mapowania off. Zmieniłem zarówno settera, jak i gettery na getImage_url i setImage_url .
Mam nadzieję że to pomoże.
źródło
POJO należy zdefiniować jako
Klasa reakcji
Klasa opakowania
i program mapujący do odczytu wartości
źródło
wrappers
, alewrapper
.Może to być bardzo późna odpowiedź, ale sama zmiana POJO na to powinna rozwiązać ciąg json podany w problemie (ponieważ, jak powiedziałeś, łańcuch wejściowy nie jest w twojej kontroli):
źródło
Inną możliwością jest ta właściwość w pliku application.properties
spring.jackson.deserialization.fail-on-unknown-properties=false
, która nie wymaga żadnej innej zmiany kodu w aplikacji. A jeśli uważasz, że umowa jest stabilna, możesz usunąć tę właściwość lub oznaczyć ją jako prawdziwą.źródło
To może nie być ten sam problem, który miał OP, ale w przypadku, gdy ktoś tu przyszedł z tym samym błędem, który miałem, pomoże to rozwiązać jego problem. Dostałem ten sam błąd co OP, gdy użyłem ObjectMapper z innej zależności niż adnotacja JsonProperty.
To działa:
Nie działa:
źródło
Google mnie tu przyprowadził i byłem zaskoczony, widząc odpowiedzi ... wszystkie sugerowały pominięcie błędu ( który zawsze rozwija się 4 razy później w rozwoju ) zamiast rozwiązywania go, dopóki ten dżentelmen nie odzyskał wiary w SO!
służy do konwersji ciągu json na obiekt klasy, brakuje tylko tego, że
TargetClass
powinien mieć publicznyget
ter /set
ters. Tego samego brakuje również we fragmencie pytania OP! :)przez lombok Twoja klasa jak poniżej powinna działać !!
źródło
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties
źródło