Java Jackson-JsonMappingException由于构造函数而导致

Java Jackson-JsonMappingException由于构造函数而导致,java,json,jackson,gson,Java,Json,Jackson,Gson,我在尝试反序列化JSON时遇到以下异常 找不到适合类型[简单类型,类MyObj$obj$Card]:无法在[源代码:java.io]处从JSON对象实例化(需要添加/启用类型信息?)。StringReader@4344ee21;行:1,列:201](通过引用链:MyObj[“obj”]->obj[“cards”]) JSON是 { "obj":{ "api":"OK", "cache":false, "cards":[ { "id":1232995897

我在尝试反序列化JSON时遇到以下异常

找不到适合类型
[简单类型,类MyObj$obj$Card]:
无法在
[源代码:java.io]处从JSON对象实例化(需要添加/启用类型信息?)。StringReader@4344ee21;行:1,列: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(“卡”)私人卡[]卡

这将产生上述异常。将类型
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(); }
}

我认为其中一个类中缺少默认构造函数。

或者:将@JsonCreator注释添加到构造函数中

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

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

  • 它可能没有默认构造函数
  • 如果没有默认构造函数,则应使用
编辑 我有两件事:
*您没有二传手。
*您没有允许设置文件的公共构造函数

如果您没有为反序列化程序提供任何(法律*)方法,反序列化程序应该如何填充字段

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

*:当然,解析器可以执行反射式的“mofidy the visibility”技巧,但别这样,这并不是“它应该以的方式进行的”

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

    @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); }     
}     
@JsonIgnoreProperties(ignoreUnknown=true)
公开期末考试卡{
@JsonIgnoreProperties(ignoreUnknown=true)
公共最终类项目{
@JsonProperty(“id”)私有字符串id;
@JsonProperty(“cat”)私有字符串cat;
@JsonProperty(“评级”)私有字符串评级;
@JsonCreator
公共项(@JsonProperty(“id”)字符串id、@JsonProperty(“cat”)字符串cat、@JsonProperty(“rating”)字符串rating){
this.id=id;
this.cat=cat;
这个。评级=评级;
}   
公共最终字符串getId(){return id;}
公共最终字符串getCat(){return cat;}
公共最终字符串getRating(){return ranting;}
公共最终字符串toString(){return new Gson().toJson(this);}
}     
@JsonProperty(“项目”)私有列表项目;
@JsonCreator
公共卡(@JsonProperty(“项目”)列表项目){
这个项目=项目;
}       
公共最终列表getItems(){return items;}
公共最终字符串toString(){return new Gson().toJson(this);}
}     

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

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

{ "count": 1917, "data": [ { "id": "1", "generated_id": "Z1-1156", "first_name": "Maruf", "last_name": "Ahmed", "full_name": "Mr. Maruf Ahmed", "email": "maruf1990@gmail.com", "phone": "+8801676798306", "company_name": "S M Style Ltd.", "website": "http:\\/\\/smartex-bd.com\\/", "address": "\\\nRoad No:5 House No:18\\\nLevel:3\\\nLane:\\\nBlock:F\\\nSector:2\\\nArea:Mirpur\\\nDhaka 1216\\\nMirpur\\\nBangladesh", "industry_type": "Apparel Retailer", "job_title": "Designer", "department": "Research & Development", "date": "7\\/10\\/2015 1:04:43 PM" }, { "id": "2", "generated_id": "Z2-1157", "first_name": "Akramul", "last_name": "Hoque", "full_name": "Mr. Akramul Hoque", "email": "akram@nassagroup.org", "phone": "+8801732005564", "company_name": "Nassa Group", "website": "www,nassagroup.org", "address": "Nassa Group\\\nRoad No:238 House No:\\\nLevel:\\\nLane:\\\nBlock:\\\nSector:\\\nArea:Gulshan li\\\nDhaka 1208\\\nTejgaon Industrial Area\\\nBangladesh", "industry_type": "Denim Garments Manufacturer", "job_title": "Merchandiser (Senior)", "department": "Merchandising", "date": "7\\/9\\/2015 10:56:22 PM" } ] }
因此,我将内部
Visitor
类声明为
static
。它对我很有用。

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

请显示将用于对象映射器的java类。如果使用上面的确切结构,则错误是由于jackson无法反序列化到内部类。如果您将其定义为静态问题,则问题应该解决。您的commetn可以作为答案,但不能被接受,也不能作为答案进行投票such@eugen,我已将
Obj
Card
类更改为static,但仍然收到相同的错误。无论如何,我能够实例化不包含数组的内部类。正是数组导致了所有的问题。请用您所拥有的内容更新您的代码,它将帮助我们解决问题。所有内部类都必须是静态的。默认情况下存在默认构造函数。因此得名。即使明确地包含它也不能解决问题。你能为“正确的映射”发布一个小片段吗?它存在,但不一定可以访问。正如eugen所指出的,您将需要使这个内部类成为静态的(因为存在类型为封闭类的隐式构造函数参数)@KonstantinPribluda-Yep。事实上,当您对内部类使用内省时,您会看到在位置0处有一个额外的参数,该参数对应于封闭类的一个实例。(我的意思是def.constructor始终存在…)如果您指定了另一个具有参数的构造函数,则它不会存在。在这种情况下,默认构造函数不存在。(注意:在您编辑问题以显示代码之前,我添加了我的答案…)我使用的是`@JsonIgnoreProperties(ignoreUnknown=true)`因此当没有使用
@JsonProperty
的显式映射时,它将被忽略。当使用
JsonProperty
进行映射时,访问器(getter\setter)不需要使用此注释
        @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();