Może się to wydawać trochę niezwykłe, ale szukam skutecznego sposobu na przekształcenie / zmapowanie pliku JsonNode
a POJO
.
Przechowuję niektóre informacje o moim modelu w plikach json i muszę obsługiwać kilka wersji mojego modelu.
To, co robię, to załadowanie pliku json do pamięci w JsonNode, zastosowanie kilku strategii przechowywania wersji, aby dopasować go do najnowszej wersji mojego modelu.
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);
O ile nie ma szybszego sposobu na zrobienie tego, prawdopodobnie w końcu po prostu ręcznie zastosuję JsonNodes
do mojego Modelu
jsonObjectMapper.readValue(jsonObjectMapper.treeAsTokens(someJsonNode), someTypeReference)
objectMapper.treeToValue(jsonNode, MyClass.class)
p.codec.treeToValue
.To powinno załatwić sprawę:
Powinienem, ponieważ używam tego z a
String
, a nie a,BufferedReader
ale powinno nadal działać.Oto mój kod:
Oto oficjalna dokumentacja tego połączenia: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)
Możesz również zdefiniować niestandardowy deserializator podczas tworzenia wystąpienia
ObjectMapper
: http://wiki.fasterxml.com/JacksonHowToCustomDeserializersEdycja: właśnie przypomniałem sobie coś innego. Jeśli twój obiekt ma więcej właściwości niż
POJO
ma i chcesz po prostu zignorować dodatki, które chcesz ustawić w ten sposób:Lub otrzymasz błąd, że nie może znaleźć właściwości do ustawienia.
źródło
Jeśli używasz org.codehaus.jackson, jest to możliwe od 1.6. Możesz przekonwertować JsonNode na POJO za pomocą
ObjectMapper#readValue
: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode , java. lang.Class)źródło
Jeśli twoje dane wejściowe JSON mają więcej właściwości niż twoje POJO i chcesz po prostu zignorować dodatki w Jackson 2.4, możesz skonfigurować ObjectMapper w następujący sposób. Ta składnia różni się od starszych wersji Jacksona. (Jeśli użyjesz złej składni, po cichu nic nie zrobi).
źródło