为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2019-12-12 10:10:54
我正在尝试浏览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);之前有人遇到过这个问题吗?如果有,有解决方案吗?任何人都能提供的帮助,我将不胜感激。
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

如果使用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 =

  new SimpleModule("PolymorphicAnimalDeserializerModule");

代替


new SimpleModule("PolymorphicAnimalDeserializerModule",

      new Version(1, 0, 0, null));

在Animal deserialize()函数中,进行以下更改


//Iterator<Entry<String, JsonNode>> elementsIterator =  root.getFields();

Iterator<Entry<String, JsonNode>> elementsIterator = root.fields();


//return mapper.readValue(root, animalClass);

return  mapper.convertValue(root, animalClass); 

这适用于fasterxml.jackson。如果它仍然抱怨类字段。字段名称使用与json中相同的格式(带有“ _”-下划线)。因为这

//mapper.setPropertyNamingStrategy(new CamelCaseNamingStrategy()); 可能不受支持。


abstract class Animal

{

  public String name;

}


class Dog extends Animal

{

  public String breed;

  public String leash_color;

}


class Cat extends Animal

{

  public String favorite_toy;

}


class Bird extends Animal

{

  public String wing_span;

  public String preferred_food;

}



查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 408 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信