Preciso converter uma certa string JSON em um objeto Java. Estou usando o Jackson para manipulação de JSON. Não tenho controle sobre o JSON de entrada (li de um serviço da web). Esta é a minha entrada JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
Aqui está um caso de uso simplificado:
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);
}
Minha classe de entidade é:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Minha classe Wrapper é basicamente um objeto de contêiner para obter minha lista de alunos:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Eu continuo recebendo esse erro e o "wrapper" retorna null
. Não tenho certeza do que está faltando. Alguém pode ajudar por favor?
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
fonte
fonte
Map dummy<String,Student> = myClientResponse.getEntity(new GenericType<Map<String, Student>>(){});
e depoisStudent myStudent = dummy.get("wrapper");
Respostas:
Você pode usar a anotação em nível de classe de Jackson:
Ele ignorará todas as propriedades que você não definiu no seu POJO. Muito útil quando você está procurando apenas algumas propriedades no JSON e não deseja escrever o mapeamento inteiro. Mais informações no site de Jackson . Se você deseja ignorar qualquer propriedade não declarada, escreva:
fonte
(ignoreUnknown = true)
ao anotar sua classe de outra forma não vai funcionarVocê pode usar
Ele ignorará todas as propriedades que não são declaradas.
fonte
A primeira resposta está quase correta, mas o necessário é alterar o método getter, NÃO campo - campo é privado (e não é detectado automaticamente); além disso, os getters têm precedência sobre os campos se ambos estiverem visíveis (também existem maneiras de tornar os campos privados visíveis, mas se você deseja obter o getter, não há muito sentido)
Portanto, getter deve ser nomeado
getWrapper()
ou anotado com:Se você preferir o nome do método getter como está.
fonte
@JsonProperty
. Embora@JsonGetter
seja um alias legal, raramente é usado como@JsonProperty
trabalho para getters, setters e campos; setters e getters podem ser distinguidos por assinatura (um não aceita argumentos, retorna não nulo; outro aceita um argumento).usando o Jackson 2.6.0, isso funcionou para mim:
e com a configuração:
fonte
ObjectMapper
, para definir aFAIL_ON_UNKNOWN_PROPERTIES
propriedade globalmente.pode ser alcançado de 2 maneiras:
Marque o POJO para ignorar propriedades desconhecidas
Configure o ObjectMapper que serializa / desserializa o POJO / json como abaixo:
fonte
Isso funcionou perfeitamente para mim
@JsonIgnoreProperties(ignoreUnknown = true)
anotação não.fonte
Wrapper
instância em que a lista de alunos estánull
vazia ou não.Isso funciona melhor do que Tudo, consulte esta propriedade.
fonte
Se você estiver usando o Jackson 2.0
fonte
De acordo com o documento, você pode ignorar os campos selecionados ou todos os campos desconhecidos:
fonte
Funcionou para mim com o seguinte código:
fonte
Adicionar setters e getters resolveu o problema , o que eu senti é que o problema real era como resolvê-lo, mas não como suprimir / ignorar o erro. Eu recebi o erro " Campo não reconhecido. Não marcado como ignorável .. "
Embora eu use a anotação abaixo na parte superior da classe, ele não foi capaz de analisar o objeto json e me fornecer a entrada
Então percebi que não adicionei setters e getters, depois de adicionar setters e getters ao "Wrapper" e ao "Student" funcionou como um encanto.
fonte
Jackson está reclamando porque não consegue encontrar um campo em sua classe Wrapper chamado "wrapper". Está fazendo isso porque seu objeto JSON possui uma propriedade chamada "wrapper".
Eu acho que a correção é renomear o campo da sua classe Wrapper para "wrapper" em vez de "alunos".
fonte
Eu tentei o método abaixo e funciona para essa leitura de formato JSON com Jackson. Use a solução já sugerida de: anotando getter com
@JsonProperty("wrapper")
Sua classe de wrapper
Minha sugestão de classe wrapper
No entanto, isso forneceria a saída do formato:
Também para obter mais informações, consulte https://github.com/FasterXML/jackson-annotations
Espero que isto ajude
fonte
{}
símbolos na barra de ferramentas para formatar seus snippets de código.Essa solução é genérica ao ler fluxos json e precisa obter apenas alguns campos, enquanto os campos não mapeados corretamente em suas Classes de Domínio podem ser ignorados:
Uma solução detalhada seria usar uma ferramenta como jsonschema2pojo para gerar automaticamente as classes de domínio necessárias, como Student, do esquema do json Response. Você pode fazer o último com qualquer conversor json para esquema online.
fonte
Anote os alunos de campo como abaixo, pois há incompatibilidade nos nomes de propriedade json e propriedade java
fonte
Como ninguém mais mencionou, pensei que eu iria ...
O problema é que sua propriedade em seu JSON é chamada "wrapper" e sua propriedade em Wrapper.class é chamada "estudantes".
Então também ...
fonte
defina public seus campos de classe não privados .
fonte
O que funcionou para mim foi tornar a propriedade pública. Isso resolveu o problema para mim.
fonte
Qualquer mudança
para
---- ou ----
Mude sua sequência JSON para
fonte
Sua entrada
indica que é um objeto, com um campo chamado "wrapper", que é uma coleção de alunos. Então, minha recomendação seria:
onde
Wrapper
é definido comofonte
O novo Firebase Android introduziu algumas mudanças enormes; abaixo da cópia do documento:
[ https://firebase.google.com/support/guides/firebase-android] :
Atualize seus objetos de modelo Java
Como no SDK 2.x, o Firebase Database converterá automaticamente objetos Java para os quais você passa
DatabaseReference.setValue()
em JSON e pode ler JSON em objetos Java usandoDataSnapshot.getValue()
.No novo SDK, ao ler JSON em um objeto Java com
DataSnapshot.getValue()
, propriedades desconhecidas no JSON agora são ignoradas por padrão, para que você não precise mais@JsonIgnoreExtraProperties(ignoreUnknown=true)
.Para excluir campos / getters ao gravar um objeto Java em JSON, a anotação agora é chamada em
@Exclude
vez de@JsonIgnore
.Se houver uma propriedade extra no seu JSON que não esteja na sua classe Java, você verá este aviso nos arquivos de log:
Você pode se livrar desse aviso colocando uma
@IgnoreExtraProperties
anotação em sua classe. Se você deseja que o Firebase Database se comporte como no SDK 2.x e gere uma exceção se houver propriedades desconhecidas, poderá colocar uma@ThrowOnExtraProperties
anotação em sua classe.fonte
Da minha parte, a única linha
@JsonIgnoreProperties(ignoreUnknown = true)
não funcionou também.
Basta adicionar
Jackson 2.4.0
fonte
Isso funcionou perfeitamente para mim
fonte
Corrigi esse problema simplesmente alterando as assinaturas dos métodos setter e getter da minha classe POJO. Tudo o que eu precisava fazer era alterar o método getObject para corresponder ao que o mapeador estava procurando. No meu caso, eu tinha um getImageUrl originalmente, mas os dados JSON tinham image_url, o que estava descartando o mapeador. Alterei meu setter e getters para getImage_url e setImage_url .
Espero que isto ajude.
fonte
O POJO deve ser definido como
Classe de resposta
Classe Wrapper
e mapeador para ler o valor
fonte
wrappers
, maswrapper
.Essa pode ser uma resposta muito tardia, mas apenas alterar o POJO para isso deve resolver a string json fornecida no problema (já que a string de entrada não está sob seu controle, como você disse):
fonte
Uma outra possibilidade é essa propriedade no application.properties
spring.jackson.deserialization.fail-on-unknown-properties=false
, que não precisará de nenhuma outra alteração de código no aplicativo. E quando você acredita que o contrato é estável, você pode remover essa propriedade ou marcar como verdadeira.fonte
Esse pode não ser o mesmo problema que o OP tinha, mas no caso de alguém chegar aqui com o mesmo erro que eu, então isso os ajudará a resolver o problema. Recebi o mesmo erro do OP quando usei um ObjectMapper de uma dependência diferente da anotação JsonProperty.
Isso funciona:
Não funciona:
fonte
O Google me trouxe aqui e fiquei surpreso ao ver as respostas ... todas sugeridas para contornar o erro ( que sempre volta 4 vezes mais tarde no desenvolvimento ) ao invés de resolvê-lo até que este cavalheiro tenha restaurado pela fé no SO!
é usado para converter uma String json em um objeto de classe, o que está faltando é que ele
TargetClass
deve ter acesso públicoget
/set
terers. O mesmo está faltando no trecho de pergunta do OP também! :)via lombok sua classe como abaixo deve funcionar !!
fonte
importar com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties
fonte