2016-02-17 5 views
2

Я хочу написать json deserializer в классе Type, чтобы при десериализации дескриптора типа json на основе имени он отображал значение (типа интерфейса Being) для его текущей реализации на основе некоторых фабричный метод, который возвращает правильное имя класса на основе имени и заполняет оставшийся класс без какой-либо явной десериализации и без создания объекта TigerBeing или HumanBeing явно используя новый.как написать jackson deserializer на основе свойства в json

Я попытался использовать @jsonCreator, но там мне нужно инициализировать весь HumanBeing или TigerBeing, используя новые и передавая все json в конструкторе. Мне нужно автоматическое сопоставление для типов, используемых далее, поскольку дальнейшее pojo может быть довольно сложным.

{type:[{ 
    "name": "Human", 
    "value": { 
     "height":6, 
     "weight":100, 
     "languages":["spanish","english"] 
    } 
}, 
{ 
"name":"Tiger", 
"value":{ 
    "extinct":1, 
    "found":["Asia", "America", "Europe", "Africa"] 
} 
} 
]} 

I have: 

public class Type { 
    String name; 
    Being value; 
} 

public interface Being { 
} 

public class TigerBeing implements Being { 
    Integer extinct; 
    String[] found; 
} 

public class HumanBeing implement Being { 
    Integer height; 
    Integer weight; 
    String[] languages; 
} 
+1

У Джексона есть поддержка полиморфных типов - см. Здесь http://programmerbruce.blogspot.de/2011/05/deserialize-json-with-jackson-into.html - Пример 4 - это sth. вы можете попробовать. Это решение потребует, чтобы вы, по крайней мере, имели атрибут типа в своей полезной нагрузке, который квалифицирует полезную нагрузку как 'TigerBeing' или' HumanBeing' –

ответ

1
import java.io.IOException; 

public class BeingDeserializer extends JsonDeserializer<Being> { 

    @Override 
    public Expertise deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonMappingException { 

    JsonNode node = jp.getCodec().readTree(jp); 
    String beingName = node.get("name").asText(); 
    JsonNode valueNode = node.get("value"); 
    BeingName beingByName = ExpertiseName.getBeingByName(beingName); 
    if(beingByName ==null) { 
     throw new JsonMappingException("Invalid Being " + beingName); 
    } 

    Being being = JsonUtils.getObjectFromJsonNode(valueNode, 
      ExpertiseFactory.getExpertise(beingByName).getClass()); 
    return being; 
    } 
} 

Таким образом, я был в состоянии решить данную проблему.

+0

Спасибо, попробуем это. до сих пор использовал хак. – user3748525

Смежные вопросы