Мне нужно преобразовать определенную строку JSON в объект Java. Я использую Джексона для обработки JSON. У меня нет контроля над вводом JSON (я читаю из веб-службы). Это мой входной JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
Вот упрощенный вариант использования:
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);
}
Мой класс сущности:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Мой класс Wrapper - это, по сути, контейнерный объект для получения моего списка учеников:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Я продолжаю получать эту ошибку, и "обертка" возвращается null
. Я не уверен, чего не хватает. Может кто-нибудь помочь, пожалуйста?
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
источник
источник
Map dummy<String,Student> = myClientResponse.getEntity(new GenericType<Map<String, Student>>(){});
а затемStudent myStudent = dummy.get("wrapper");
Ответы:
Вы можете использовать аннотацию уровня класса Джексона:
Он будет игнорировать все свойства, которые вы не определили в вашем POJO. Очень полезно, когда вы просто ищете пару свойств в JSON и не хотите писать полное отображение. Больше информации на сайте Джексона . Если вы хотите игнорировать любое не объявленное свойство, вы должны написать:
источник
(ignoreUnknown = true)
аннотировать ваш класс, иначе это не сработаетТы можешь использовать
Он будет игнорировать все свойства, которые не объявлены.
источник
Первый ответ почти правильный, но необходимо изменить метод получения, а НЕ поле - поле является закрытым (и не определяется автоматически); кроме того, геттеры имеют приоритет над полями, если оба видны. (Есть также способы сделать приватные поля видимыми, но если вы хотите получить геттер, нет особого смысла)
Таким образом, метод get должен быть либо назван
getWrapper()
, либо аннотирован:Если вы предпочитаете имя метода получения как есть.
источник
@JsonProperty
. Хотя@JsonGetter
это допустимый псевдоним, он редко используется в качестве@JsonProperty
работы для получателей, установщиков и полей; сеттеры и геттеры могут различаться по сигнатуре (один не принимает аргументов, возвращает не void; другой принимает один аргумент).используя Джексон 2.6.0, это сработало для меня:
и с настройкой:
источник
ObjectMapper
, для установкиFAIL_ON_UNKNOWN_PROPERTIES
свойства глобально.это может быть достигнуто 2 способами:
Отметьте POJO, чтобы игнорировать неизвестные свойства
Настройте ObjectMapper, который сериализует / десериализует POJO / json, как показано ниже:
источник
Это просто отлично работает для меня
@JsonIgnoreProperties(ignoreUnknown = true)
аннотации не было.источник
Wrapper
случае, когда список студентовnull
пуст или пуст.Это работает лучше, чем все, пожалуйста, обратитесь к этой собственности.
источник
Если вы используете Джексон 2.0
источник
Согласно документу вы можете игнорировать выбранные поля или все неизвестные поля:
источник
У меня это работает с помощью следующего кода:
источник
Добавление сеттеров и геттеров решило проблему , но я чувствовал, что проблема заключается в том, как ее решить, а не в том, как подавить / игнорировать ошибку. Я получил ошибку " Нераспознанное поле .. не помечено как игнорируемое .. "
Хотя я использую приведенную ниже аннотацию поверх класса, она не смогла проанализировать объект json и дать мне входные данные.
Затем я понял, что я не добавлял сеттеры и геттеры, после добавления сеттеров и геттеров в «Обертку» и «Студент» это работало как шарм.
источник
Джексон жалуется, потому что не может найти поле в вашем классе Wrapper, которое называется «обертка». Это происходит потому, что у вашего объекта JSON есть свойство, называемое «обертка».
Я думаю, что решение заключается в том, чтобы переименовать поле вашего класса Wrapper в «обертку» вместо «студентов».
источник
Я попробовал описанный ниже метод, и он работает для чтения такого формата JSON с Джексоном. Используйте уже предложенное решение: аннотирование геттера с помощью
@JsonProperty("wrapper")
Ваш класс обертки
Мое предложение класса обертки
Это, однако, даст вам вывод формата:
Также для получения дополнительной информации обратитесь к https://github.com/FasterXML/jackson-annotations
Надеюсь это поможет
источник
{}
символы на панели инструментов для форматирования фрагментов кода.Это решение является общим при чтении потоков json и требует получения только некоторых полей, в то время как поля, не отображенные правильно в ваших классах домена, можно игнорировать:
Подробным решением будет использование такого инструмента, как jsonschema2pojo, для автоматического создания необходимых классов предметной области, таких как Student, из схемы ответа json. Это можно сделать с помощью любого онлайн-конвертера json в схему.
источник
Аннотируйте полевых студентов, как показано ниже, поскольку в именах свойств json и java есть несоответствие
источник
Как никто не упомянул, думал, что я ...
Проблема в том, что ваша собственность в вашем JSON называется «оболочкой», а ваша собственность в Wrapper.class называется «студентами».
Так что либо ...
источник
сделайте общедоступными ваши поля класса, а не частными .
источник
То, что работало для меня, должно было сделать собственность публичной. Это решило проблему для меня.
источник
Либо изменить
в
---- или ----
Измените строку JSON на
источник
Ваш вклад
указывает, что это объект с полем с именем «обертка», который является коллекцией студентов. Так что моя рекомендация будет,
где
Wrapper
определяется какисточник
В новом Firebase Android внесены огромные изменения; ниже копия документа:
[ https://firebase.google.com/support/guides/firebase-android] :
Обновите ваши объекты модели Java
Как и в 2.x SDK, база данных Firebase автоматически преобразует объекты Java, которые вы передаете,
DatabaseReference.setValue()
в JSON и может читать JSON в объекты Java с помощьюDataSnapshot.getValue()
.В новом SDK при чтении JSON в объект Java с
DataSnapshot.getValue()
неизвестными свойствами в JSON теперь по умолчанию игнорируются, поэтому вам больше не нужно@JsonIgnoreExtraProperties(ignoreUnknown=true)
.Чтобы исключить поля / получатели при записи объекта Java в JSON, теперь вызывается аннотация
@Exclude
вместо@JsonIgnore
.Если в вашем JSON есть дополнительное свойство, которого нет в вашем классе Java, вы увидите это предупреждение в файлах журнала:
Вы можете избавиться от этого предупреждения, поместив
@IgnoreExtraProperties
аннотацию на ваш класс. Если вы хотите, чтобы база данных Firebase вела себя так же, как в 2.x SDK, и выдает исключение, если есть неизвестные свойства, вы можете добавить@ThrowOnExtraProperties
аннотацию к своему классу.источник
С моей стороны, единственная линия
@JsonIgnoreProperties(ignoreUnknown = true)
тоже не работал
Просто добавь
Джексон 2.4.0
источник
Это отлично сработало для меня
источник
Я исправил эту проблему, просто изменив подписи моих методов установки и получения моего класса POJO. Все, что мне нужно было сделать, это изменить метод getObject, чтобы он соответствовал тому, что искал маппер. В моем случае у меня изначально был getImageUrl , но у данных JSON был image_url, который отбрасывал маппер. Я изменил и мои сеттеры, и геттеры на getImage_url и setImage_url .
Надеюсь это поможет.
источник
POJO должен быть определен как
Класс ответа
Класс Wrapper
и картограф для чтения значения
источник
wrappers
, ноwrapper
.Это может быть очень поздний ответ, но простое изменение POJO на это должно решить строку json, представленную в задаче (поскольку входная строка не находится под вашим контролем, как вы сказали):
источник
Еще одна возможность - это свойство в application.properties
spring.jackson.deserialization.fail-on-unknown-properties=false
, которое не потребует никаких других изменений кода в вашем приложении. И когда вы считаете, что договор является стабильным, вы можете удалить это свойство или отметить его как истинное.источник
Возможно, это не та же проблема, что и у ОП, но в случае, если кто-то попал сюда с той же ошибкой, что и я, это поможет им решить их проблему. Я получил ту же ошибку, что и OP, когда использовал ObjectMapper из другой зависимости, что и аннотация JsonProperty.
Это работает:
Не работает:
источник
Google привел меня сюда, и я был удивлен, увидев ответы ... все предложили обойти ошибку ( которая всегда откатывается на 4 раза позже в процессе разработки ), а не решать ее до тех пор, пока этот джентльмен не будет восстановлен верой в ТАК!
используются для преобразования JSON строки в объект класса, Что пропавшее является то , что
TargetClass
должно быть общественнымиget
терли /set
теры. То же самое отсутствует в фрагменте вопроса ОП тоже! :)через ломбок твой класс как ниже должен работать !!
источник
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties
источник