Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.96 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.Collection;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.Map;
  7. import java.util.Map.Entry;
  8.  
  9. import org.codehaus.jackson.JsonNode;
  10. import org.codehaus.jackson.JsonParser;
  11. import org.codehaus.jackson.JsonProcessingException;
  12. import org.codehaus.jackson.Version;
  13. import org.codehaus.jackson.map.DeserializationContext;
  14. import org.codehaus.jackson.map.ObjectMapper;
  15. import org.codehaus.jackson.map.deser.StdDeserializer;
  16. import org.codehaus.jackson.map.module.SimpleModule;
  17. import org.codehaus.jackson.node.ObjectNode;
  18.  
  19. import fubar.CamelCaseNamingStrategy;
  20.  
  21. public class Foo
  22. {
  23.   public static void main(String[] args) throws Exception
  24.   {
  25.     AnimalDeserializer deserializer =
  26.         new AnimalDeserializer();
  27.     deserializer.registerAnimal("leash_color", Dog.class);
  28.     deserializer.registerAnimal("favorite_toy", Cat.class);
  29.     deserializer.registerAnimal("wing_span", Bird.class);
  30.     SimpleModule module =
  31.       new SimpleModule("PolymorphicAnimalDeserializerModule",
  32.           new Version(1, 0, 0, null));
  33.     module.addDeserializer(Animal.class, deserializer);
  34.    
  35.     ObjectMapper mapper = new ObjectMapper();
  36.     mapper.setPropertyNamingStrategy(
  37.         new CamelCaseNamingStrategy());
  38.     mapper.registerModule(module);
  39.  
  40.     Zoo zoo =
  41.         mapper.readValue(new File("input_6.json"), Zoo.class);
  42.     System.out.println(mapper.writeValueAsString(zoo));
  43.   }
  44. }
  45.  
  46. class AnimalDeserializer extends StdDeserializer<Animal>
  47. {
  48.   private Map<String, Class<? extends Animal>> registry =
  49.       new HashMap<String, Class<? extends Animal>>();
  50.  
  51.   AnimalDeserializer()
  52.   {
  53.     super(Animal.class);
  54.   }
  55.  
  56.   void registerAnimal(String uniqueAttribute,
  57.       Class<? extends Animal> animalClass)
  58.   {
  59.     registry.put(uniqueAttribute, animalClass);
  60.   }
  61.  
  62.   @Override
  63.   public Animal deserialize(
  64.       JsonParser jp, DeserializationContext ctxt)
  65.       throws IOException, JsonProcessingException
  66.   {
  67.     ObjectMapper mapper = (ObjectMapper) jp.getCodec();
  68.     ObjectNode root = (ObjectNode) mapper.readTree(jp);
  69.     Class<? extends Animal> animalClass = null;
  70.     Iterator<Entry<String, JsonNode>> elementsIterator =
  71.         root.getFields();
  72.     while (elementsIterator.hasNext())
  73.     {
  74.       Entry<String, JsonNode> element=elementsIterator.next();
  75.       String name = element.getKey();
  76.       if (registry.containsKey(name))
  77.       {
  78.         animalClass = registry.get(name);
  79.         break;
  80.       }
  81.     }
  82.     if (animalClass == null) return null;
  83.     return mapper.readValue(root, animalClass);
  84.   }
  85. }
  86.  
  87. class Zoo
  88. {
  89.   public Collection<Animal> animals;
  90. }
  91.  
  92. abstract class Animal
  93. {
  94.   public String name;
  95. }
  96.  
  97. class Dog extends Animal
  98. {
  99.   public String breed;
  100.   public String leashColor;
  101. }
  102.  
  103. class Cat extends Animal
  104. {
  105.   public String favoriteToy;
  106. }
  107.  
  108. class Bird extends Animal
  109. {
  110.   public String wingSpan;
  111.   public String preferredFood;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement