Это может показаться немного необычным, но я ищу эффективный способ преобразовать / сопоставить a JsonNode
в POJO
.
Я храню часть информации о моей модели в файлах json, и мне нужно поддерживать несколько версий моей модели.
Что я делаю, так это загружаю файл json в память в JsonNode, применяю несколько стратегий управления версиями, чтобы он соответствовал последней версии моей модели.
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);
Если нет более быстрого способа сделать это, я, вероятно, закончу просто вручную, применив JsonNodes
к моей модели
jsonObjectMapper.readValue(jsonObjectMapper.treeAsTokens(someJsonNode), someTypeReference)
objectMapper.treeToValue(jsonNode, MyClass.class)
p.codec.treeToValue
.Это должно помочь:
Я говорю «должен», потому что я использую это с, а
String
не с,BufferedReader
но он все равно должен работать.Вот мой код:
String inputString = // I grab my string here MySessionClass sessionObject; try { ObjectMapper objectMapper = new ObjectMapper(); sessionObject = objectMapper.readValue(inputString, MySessionClass.class);
Вот официальная документация для этого вызова: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)
Вы также можете определить собственный десериализатор при создании экземпляра
ObjectMapper
: http://wiki.fasterxml.com/JacksonHowToCustomDeserializersИзменить: я только что вспомнил кое-что еще. Если ваш входящий объект имеет больше свойств, чем
POJO
имеет, и вы просто хотите игнорировать дополнительные функции, вы захотите установить это:objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Или вы получите сообщение об ошибке, что не удается найти свойство, в которое нужно установить.
источник
Если вы используете org.codehaus.jackson, это стало возможно с версии 1.6. Вы можете преобразовать JsonNode в POJO с помощью
ObjectMapper#readValue
: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode , java. lang.Class)ObjectMapper mapper = new ObjectMapper(); JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}"); JsonNode tree = jsonParser.readValueAsTree(); // Do stuff to the tree mapper.readValue(tree, Foo.class);
источник
String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} "; com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper(); MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);
Если ваш вход JSON имеет больше свойств, чем ваш POJO, и вы просто хотите игнорировать дополнительные функции в Jackson 2.4, вы можете настроить свой ObjectMapper следующим образом. Этот синтаксис отличается от более старых версий Джексона. (Если вы используете неправильный синтаксис, он ничего не сделает.)
источник