用Jackson将反序列化的JSON转换为多态类型-一个完整的示例给我一个编译错误

我正在尝试浏览Programmer Bruce的教程,该教程应该允许多态JSON的反序列化。


完整列表可以在这里找到 Programmer Bruce教程(很棒的东西)


我已经完成了前五项工作,没有任何问题,但是我在最后一项中遇到了麻烦(示例6),这当然是我真正需要工作的部分。


编译时出现以下错误


ObjectMapper类型的方法readValue(JsonParser,Class)不适用于参数(ObjectNode,Class)


这是由代码块引起的


  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);

  }  

具体按行


返回mapper.readValue(root,animalClass);


之前有人遇到过这个问题吗?如果有,有解决方案吗?


任何人都能提供的帮助,我将不胜感激。


沧海一幻觉
浏览 409回答 3
3回答

一只斗牛犬

如果使用fasterxml,可能需要这些更改import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.core.Version;import com.fasterxml.jackson.databind.DeserializationContext;import com.fasterxml.jackson.databind.JsonNode;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.deser.std.StdDeserializer;import com.fasterxml.jackson.databind.module.SimpleModule;import com.fasterxml.jackson.databind.node.ObjectNode;在主要方法中采用SimpleModule module =&nbsp; new SimpleModule("PolymorphicAnimalDeserializerModule");代替new SimpleModule("PolymorphicAnimalDeserializerModule",&nbsp; &nbsp; &nbsp; new Version(1, 0, 0, null));在Animal deserialize()函数中,进行以下更改//Iterator<Entry<String, JsonNode>> elementsIterator =&nbsp; root.getFields();Iterator<Entry<String, JsonNode>> elementsIterator = root.fields();//return mapper.readValue(root, animalClass);return&nbsp; mapper.convertValue(root, animalClass);&nbsp;这适用于fasterxml.jackson。如果它仍然抱怨类字段。字段名称使用与json中相同的格式(带有“ _”-下划线)。因为这//mapper.setPropertyNamingStrategy(new CamelCaseNamingStrategy()); 可能不受支持。abstract class Animal{&nbsp; public String name;}class Dog extends Animal{&nbsp; public String breed;&nbsp; public String leash_color;}class Cat extends Animal{&nbsp; public String favorite_toy;}class Bird extends Animal{&nbsp; public String wing_span;&nbsp; public String preferred_food;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JQuery