28

尝试反序列化 JSON 时出现以下异常

找不到适合类型的构造函数,[simple type, class MyObj$obj$Card]:无法从 JSON 对象实例化(需要添加/启用类型信息?)在[Source: java.io.StringReader@4344ee21; line: 1, column: 201](通过引用链MyObj["obj"]->Obj["cards"]:)

JSON是

{
  "obj":{
  "api":"OK",
  "cache":false,
  "cards":[
     {
        "id":1232995897,
        "items":[
           {
              "id":"vmdSJLpnY",
              "cat":50,
              "rating":0.0
           }
        ]
     },
     {
        "id":0005897,
        "items":[
           {
              "id":"vxdSJLpnY",
              "cat":50,
              "rating":0.0
           }
        ]
     }
 ]
 }
}

Obj课堂上我有以下陈述

@JsonProperty("cards") private Card[] cards;

这会产生上述异常。将类型更改Card[]Object[]不会产生异常,但它缺少我想要获得的正确映射。

任何线索我该如何解决?一个片段会很棒!这个错误到底意味着什么?

更新

我已经包含了 Java 类。

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.gson.Gson;

@JsonIgnoreProperties(ignoreUnknown=true)
public final class MyObj {
    @JsonIgnoreProperties(ignoreUnknown=true)
    public final class Obj {
        @JsonIgnoreProperties(ignoreUnknown=true)
        public final class Card {
            @JsonIgnoreProperties(ignoreUnknown=true)
            public final class Item {
                @JsonProperty("id") private String id;
                @JsonProperty("cat") private String cat;
                @JsonProperty("rating") private String rating;
                public final String getId() { return id; }
                public final String getCat() { return cat; }
                public final String getRating() { return ranting; }
                public final String toString() { return new Gson().toJson(this); }
            }

            @JsonProperty("items") private Item[] items;
            public final Item[] getItems() { return items; }
            public final String toString() { return new Gson().toJson(this); }
        }

        @JsonProperty("cards") private Card[] cards;
        public Card[] getCards() { return cards; }
        public final String toString() { return new Gson().toJson(this); }      
    }


    @JsonProperty("obj") MyObj obj;
    public final Card[] getCards(){ return apiServiceResultsNoLists.getCards(); }
}
4

6 回答 6

45

我认为问题很可能出在Card对象上

编辑 我有两件事:
*你没有二传手。
*您没有可以设置您的文件的公共构造函数。

如果你不给它任何(合法*)手段,反序列化器应该如何填充你的字段?

解决方案:
-> 将公共设置器添加到类中
-> 或创建带有 @JsonCreator 注释的参数化构造函数

*:当然,解析器可以做反射性的“修改可见性”技巧,但是拜托,这不是“它的播放方式”

EDIT2 我认为这应该可行,但我无法测试它 - 我手头没有一个项目,杰克逊现在正确设置(这只是其中的一部分,但我认为很容易解释我想要的显示。)注意,我将数组更改为列表:

    @JsonIgnoreProperties(ignoreUnknown=true)     
public final class Card {     
    @JsonIgnoreProperties(ignoreUnknown=true)

    public final class Item {     
        @JsonProperty("id") private String id;     
        @JsonProperty("cat") private String cat;     
        @JsonProperty("rating") private String rating;     

        @JsonCreator
        public Item(@JsonProperty("id") String id, @JsonProperty("cat") String cat, @JsonProperty("rating") String rating) {
            this.id = id;
            this.cat = cat;
            this.rating = rating;
        }   


        public final String getId() { return id; }     
        public final String getCat() { return cat; }     
        public final String getRating() { return ranting; }     
        public final String toString() { return new Gson().toJson(this); }     
    }     
    @JsonProperty("items") private List<Item> items;     

    @JsonCreator
    public Card(@JsonProperty("items") List<Item> items) {
        this.items = items;
    }       

    public final List<Item> getItems() { return items; }     

    public final String toString() { return new Gson().toJson(this); }     
}     
于 2012-10-11T09:17:50.410 回答
11

前几天我有同样的症状并接受了建议JsonCreatorJsonProperty但我得到了同样的错误信息。事实证明,我正在从事的项目使用的是 fastxml 和 codehaus 的 jackson 版本。我将 codehaus 属性放在我的类上,但使用 fasterxml 的 ObjectMapper 进行解析。他们喜欢传递依赖。

于 2014-08-14T16:30:45.327 回答
6

我一直面临着同样的问题。我的 Json 数据集如下

{
“计数”:1917,
  “数据”: [
    {
      “id”:“1”,
      "generated_id": "Z1-1156",
      "first_name": "Maruf",
      "last_name": "艾哈迈德",
      "full_name": "Maruf Ahmed 先生",
      “电子邮件”:“maruf1990@gmail.com”,
      "电话": "+8801676798306",
      "company_name": "SM Style Ltd.",
      "网站": "http:\\/\\/smartex-bd.com\\/",
      "地址": "\\\n路号:5 楼号:18\\\n等级:3\\\n车道:\\\n街区:F\\\n扇区:2\\\n地区:米尔普尔\\\n达卡1216 \\\nMirpur\\\n孟加拉国",
      "industry_type": "服装零售商",
      "job_title": "设计师",
      “部门”:“研发”,
      “日期”:“7\\/10\\/2015 下午 1:04:43”
    },
    {
      “id”:“2”,
      "generated_id": "Z2-1157",
      "first_name": "Akramul",
      "last_name": "Hoque",
      "full_name": "Akramul Hoque 先生",
      “电子邮件”:“akram@nassagroup.org”,
      "电话": "+8801732005564",
      "company_name": "纳萨集团",
      "网站": "www,nassagroup.org",
      "地址": "纳萨集团\\\n路号:238门牌号:\\\n层级:\\\n车道:\\\n地块:\\\n扇区:\\\n地区:高尔山里\\\n达卡1208\ \\nTejgaon 工业区\\\n孟加拉国",
      "industry_type": "牛仔服装制造商",
      "job_title": "跟单员(高级)",
      “部门”:“销售”,
      “日期”:“7\\/9\\/2015 晚上 10:56:22”
    }
    ]
}
        @JsonIgnoreProperties(ignoreUnknown = true)
    public class Visitors {



      @JsonIgnoreProperties(ignoreUnknown = true)
      public static class Visitor{
        @JsonProperty("id")
        public String mId;

        @JsonProperty("generated_id")
        public String mGenId;

        @JsonProperty("first_name")
        public String mFirstName;

        @JsonProperty("last_name")
        public String mLastName;

        @JsonProperty("full_name")
        public String mFullName;

        @JsonProperty("email")
        public String mEmail;

        @JsonProperty("phone")
        public String mPhone;

        @JsonProperty("company_name")
        public String mCompanyName;

        @JsonProperty("website")
        public String mWebsite;

        @JsonProperty("address")
        public String mAdress;

        @JsonProperty("industry_type")
        public String mIndustryType;

        @JsonProperty("job_title")
        public String mJobtitle;

        @JsonProperty("department")
        public String mDepartment;

        @JsonProperty("date")
        public String mDate;


        public Visitor(@JsonProperty("id") String  Id,
                       @JsonProperty("generated_id") String  GenId,
                       @JsonProperty("first_name") String  FirstName,
                       @JsonProperty("last_name") String  LastName,
                       @JsonProperty("full_name") String  FullName,
                       @JsonProperty("email") String  Email,
                       @JsonProperty("phone") String  Phone,
                       @JsonProperty("company_name") String  CompanyName,
                       @JsonProperty("website") String  Website,
                       @JsonProperty("address") String  Adress,
                       @JsonProperty("industry_type") String  IndustryType,
                       @JsonProperty("job_title") String  Jobtitle,
                       @JsonProperty("department") String  Department,
                       @JsonProperty("date") String  date)
        {
          mId = Id;
          mGenId = GenId;
          mFirstName = FirstName;
          mLastName= LastName;
          mFullName= FullName;
          mEmail= Email;
          mPhone= Phone;
          mCompanyName= CompanyName;
          mWebsite= Website;
          mAdress= Adress;
          mIndustryType= IndustryType;
          mJobtitle= Jobtitle;
          mDepartment= Department;
          mDate= date;
        }
      }


      @JsonProperty("count") public String mCount;


      @JsonProperty("data")  public ArrayList<Visitor> mVisitorList;

      @JsonCreator
      public Visitors(  @JsonProperty("count") String Count,
                        @JsonProperty("data") ArrayList<Visitor> visitorList)
      {
        mCount = Count;
        mVisitorList = visitorList;
      }
    }

问题是内部类声明,它应该是静态的。因为杰克逊需要像访问它一样

new Visitors.Visitor();

所以我将内部Visitor类声明为static. 它对我有用。

于 2015-08-05T19:08:19.100 回答
3

我认为您在其中一个类中缺少默认构造函数。
或者:将 @JsonCreator 注释添加到构造函数

于 2012-10-11T09:15:21.553 回答
1

查看您的 Card 类 - 很可能没有可访问的默认构造函数或构造函数缺少正确的映射。

于 2012-10-11T09:15:47.413 回答
1

将默认构造函数添加到类和所有嵌套的用户定义类。它应该工作。

于 2020-09-23T10:26:36.780 回答