Preciso de converter uma certa string JSON para um objecto Java. Estou a usar o Jackson para manipulação do JSON. Eu não tenho controle sobre a entrada JSON (eu leio de um serviço 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);
}
A minha classe de entidade é:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
A minha classe Wrapper é basicamente um objecto de contentor para obter a minha lista de alunos:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Continuo a receber este erro e "wrapper" devolve null
. Eu não tenho certeza do que's falta. 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)
Você pode usar a anotação de nível de classe da Jackson's:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
@JsonIgnoreProperties
class { ... }
Ignorará todas as propriedades que você tem't definidas no seu POJO. Muito útil quando você está apenas procurando por algumas propriedades no JSON e don't quer escrever todo o mapeamento. Mais informações em Jackson's website. Se você quiser ignorar qualquer propriedade não declarada, você deve escrever:
@JsonIgnoreProperties(ignoreUnknown = true)
A primeira resposta é quase correta, mas o que é necessário é mudar o método getter, NOT field -- field is private (and not auto-detected); além disso, os getters têm precedência sobre os campos se ambos forem visíveis.(Há maneiras de tornar os campos privados visíveis também, mas se você quiser ter getter lá'não adianta muito)
Então getter deve ser chamado getWrapper()
, ou anotado com:
@JsonProperty("wrapper")
Se você preferir o nome do método getter como está.
Jackson está reclamando porque ele pode't encontrar um campo na sua classe Wrapper que's chamado "wrapper". Ele's está fazendo isso porque o seu objeto JSON tem uma propriedade chamada "wrapper".
Acho que a solução é renomear sua classe Wrapper's field para "wrapper" ao invés de "students".