簡體   English   中英

如何根據json中的屬性編寫傑克遜解串器

[英]how to write jackson deserializer based on property in json

我想在類Type上編寫json反序列化器,以便當Type根據名稱從給定的json反序列化時,它會根據一些返回基於名稱的正確類名稱的工廠方法,將值(接口類型為Being)映射到其當前實現,並填充剩余的類,而無需任何顯式的反序列化,也無需使用new顯式創建TigerBeing或HumanBeing的對象。

我嘗試使用@jsonCreator,但我必須使用new初始化整個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;
}
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;
  }
}

這樣我就可以解決以上問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM