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

如何识别 Jackson 错误中缺少的类型 ID?

如何识别 Jackson 错误中缺少的类型 ID?

沧海一幻觉 2023-06-08 17:16:22
我正在使用 Jackson 将 JSON 写入文本文件,JSON 表示从抽象类继承的 2 个类,但无论是否使用两个类或一个/或一个类,都会发生错误。JSON 似乎编写正确,但在阅读时,我收到以下错误:Missing type id when trying to resolve subtype of [simple type, class model.BaseContact]: missing type id property 'type'     at [Source: (File); line: 52, column: 1]json as follows:    {   "allContacts" : [ {     "type" : "personal",    "addressCity" : "Hamilton",    "addressNum" : "199",   "addressPOBox" : null,    "addressPostCode" : null,    "addressStreet" : "River Rd",    "addressSuburb" : null,    "email" : null,    "latitude" : null,    "longitude" : null,    "name" : "silly simon",    "notes" : null,    "phoneNumber" : "09754321",    "photoBytes" : null,    "photoURL" : null  }, {    "type" : "personal",    "addressCity" : "Auckland",    "addressNum" : "482",    "addressPOBox" : null,    "addressPostCode" : null,    "addressStreet" : "Smith Rd",    "addressSuburb" : null,    "email" : null,    "latitude" : null,    "longitude" : null,    "name" : "paul smith",    "notes" : null,    "phoneNumber" : "0544555",    "photoBytes" : null,    "photoURL" : null  }, {    "type" : "personal",    "addressCity" : "Appleby",    "addressNum" : "123",    "addressPOBox" : null,    "addressPostCode" : null,    "addressStreet" : "Apple rd",    "addressSuburb" : null,    "email" : null,    "latitude" : null,    "name" : "Steve Jobbs",    "notes" : null,    "phoneNumber" : "08004343",    "photoBytes" : null,    "photoURL" : null  } ],  "size" : 3}错误消息指的是第 52 行第 1 列,假设调试器从第 1 行开始,该行将是最后一个大括号之后的行。
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

更新:

BusinessContactclass 应该用@JsonTypeName("business") 和PersonContactclass with@JsonTypeName("personal")而不是注释@JsonTypeName("type"),因为你应该在继承者中定义特定类型。

@JsonTypeInfo注释完全可以从子类中删除。

更新 2:

附加PersonContact类应该有默认构造函数:

public PersonContact(){}

输入 JSON 文件不是列表,它是具有两个属性的实体allContactssize。因此它不能映射到ArrayList<BaseContact>. 因此,应创建具有这两个属性的新实体:

public class ContactsWrapper

{

   private List<BaseContact> allContacts;

   private int size;


   public List<BaseContact> getAllContacts()

   {

      return allContacts;

   }


   public void setAllContacts(List<BaseContact> allContacts)

   {

      this.allContacts = allContacts;

   }


   public int getSize()

   {

      return size;

   }


   public void setSize(int size)

   {

      this.size = size;

   }

}

应该更改读取 JSON 的代码:


ContactsWrapper contactsWrapper = new ObjectMapper().readerFor(ContactsWrapper.class).readValue(new File(fn));

abl = contactsWrapper.getAllContacts();

现在 JSON 被映射到ContactsWrapper并使用 getter 将联系人列表分配给abl变量。


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 265 浏览

添加回答

举报

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