Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.File;
- import java.io.IOException;
- import java.util.Collection;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Map.Entry;
- import org.codehaus.jackson.JsonNode;
- import org.codehaus.jackson.JsonParser;
- import org.codehaus.jackson.JsonProcessingException;
- import org.codehaus.jackson.Version;
- import org.codehaus.jackson.map.DeserializationContext;
- import org.codehaus.jackson.map.ObjectMapper;
- import org.codehaus.jackson.map.deser.StdDeserializer;
- import org.codehaus.jackson.map.module.SimpleModule;
- import org.codehaus.jackson.node.ObjectNode;
- import fubar.CamelCaseNamingStrategy;
- public class Foo
- {
- public static void main(String[] args) throws Exception
- {
- AnimalDeserializer deserializer =
- new AnimalDeserializer();
- deserializer.registerAnimal("leash_color", Dog.class);
- deserializer.registerAnimal("favorite_toy", Cat.class);
- deserializer.registerAnimal("wing_span", Bird.class);
- SimpleModule module =
- new SimpleModule("PolymorphicAnimalDeserializerModule",
- new Version(1, 0, 0, null));
- module.addDeserializer(Animal.class, deserializer);
- ObjectMapper mapper = new ObjectMapper();
- mapper.setPropertyNamingStrategy(
- new CamelCaseNamingStrategy());
- mapper.registerModule(module);
- Zoo zoo =
- mapper.readValue(new File("input_6.json"), Zoo.class);
- System.out.println(mapper.writeValueAsString(zoo));
- }
- }
- class AnimalDeserializer extends StdDeserializer<Animal>
- {
- private Map<String, Class<? extends Animal>> registry =
- new HashMap<String, Class<? extends Animal>>();
- AnimalDeserializer()
- {
- super(Animal.class);
- }
- void registerAnimal(String uniqueAttribute,
- Class<? extends Animal> animalClass)
- {
- registry.put(uniqueAttribute, animalClass);
- }
- @Override
- public Animal deserialize(
- JsonParser jp, DeserializationContext ctxt)
- throws IOException, JsonProcessingException
- {
- ObjectMapper mapper = (ObjectMapper) jp.getCodec();
- ObjectNode root = (ObjectNode) mapper.readTree(jp);
- Class<? extends Animal> animalClass = null;
- Iterator<Entry<String, JsonNode>> elementsIterator =
- root.getFields();
- while (elementsIterator.hasNext())
- {
- Entry<String, JsonNode> element=elementsIterator.next();
- String name = element.getKey();
- if (registry.containsKey(name))
- {
- animalClass = registry.get(name);
- break;
- }
- }
- if (animalClass == null) return null;
- return mapper.readValue(root, animalClass);
- }
- }
- class Zoo
- {
- public Collection<Animal> animals;
- }
- abstract class Animal
- {
- public String name;
- }
- class Dog extends Animal
- {
- public String breed;
- public String leashColor;
- }
- class Cat extends Animal
- {
- public String favoriteToy;
- }
- class Bird extends Animal
- {
- public String wingSpan;
- public String preferredFood;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement