如何根据json中的属性编写jackson反序列化器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据json中的属性编写jackson反序列化器相关的知识,希望对你有一定的参考价值。

我想在类Type上编写json反序列化器,以便当基于名称从给定的json反序列化Type时,它将值(接口类型为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;
  }
}

通过这种方式,我能够解决上述问题。

以上是关于如何根据json中的属性编写jackson反序列化器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jackson(Java)反序列化对象中的json对象?

使用 Jackson 根据 API 版本指定不同的 JSON 属性名称

json之jackson序列化反序列化探究(二)

在使用 Jackson 反序列化期间选择性地忽略 JSON 属性

使用“key”和“value”属性反序列化 JSON 映射不适用于 Jackson

如何让Jackson JSON生成的数据包含的中文以unicode方式编码