Isso pode parecer um pouco incomum, mas estou procurando uma maneira eficiente de transformar / mapear a JsonNode
em a POJO
.
Eu armazeno algumas das informações do meu modelo em arquivos json e tenho que suportar algumas versões do meu modelo.
O que faço é carregar o arquivo json na memória em um JsonNode, aplicar algumas estratégias de versão para torná-lo compatível com a versão mais recente do meu Model.
ObjectMapper mapper = new ObjectMapper();
BufferedReader fileReader = new BufferedReader(new FileReader(projPath));
JsonNode rootNode = mapper.readTree(fileReader);
//Upgrade our file in memory
applyVersioningStrategy(rootNode);
ProjectModel project = mapJsonNodeToProject(rootNode);
A menos que exista uma maneira mais rápida de fazer isso, provavelmente acabarei aplicando manualmente o JsonNodes
ao meu Model
jsonObjectMapper.readValue(jsonObjectMapper.treeAsTokens(someJsonNode), someTypeReference)
objectMapper.treeToValue(jsonNode, MyClass.class)
p.codec.treeToValue
.Isso deve fazer o truque:
Eu digo que deveria, porque estou usando isso com um
String
, não um,BufferedReader
mas ainda deve funcionar.Aqui está o meu código:
Aqui está a documentação oficial para essa chamada: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)
Você também pode definir um desserializador personalizado ao instanciar o
ObjectMapper
: http://wiki.fasterxml.com/JacksonHowToCustomDeserializersEdit: Acabei de me lembrar de outra coisa. Se o seu objeto que chega tem mais propriedades do que o
POJO
seu e você deseja apenas ignorar os extras, defina isso:Ou você receberá um erro que não consegue encontrar a propriedade para definir.
fonte
Se você estiver usando org.codehaus.jackson, isso é possível desde a versão 1.6. Você pode converter um JsonNode em um POJO com
ObjectMapper#readValue
: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode , java. lang.Class)fonte
Se sua entrada JSON tiver mais propriedades do que seu POJO e você quiser apenas ignorar os extras no Jackson 2.4, poderá configurar seu ObjectMapper da seguinte maneira. Essa sintaxe é diferente das versões mais antigas de Jackson. (Se você usar a sintaxe errada, ela silenciosamente não fará nada.)
fonte