web-dev-qa-db-ja.com

ジャクソン-コンストラクターによるJsonMappingException

JSONをデシリアライズしようとすると、次の例外が発生します

タイプ_[simple type, class MyObj$obj$Card]:_に適したコンストラクターが見つかりません([Source: Java.io.StringReader@4344ee21; line: 1, column: 201]_でJSONオブジェクトからインスタンス化できません(タイプ情報を追加/有効にする必要がありますか?)(参照チェーン:_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[]_に変更しても例外は生成されませんが、取得したい正しいマッピングがありません。

どのように解決できますか?スニペットは素晴らしいでしょう!このエラーはどういう意味ですか?

[〜#〜] update [〜#〜]

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(); }
}
_
27
Mr.

問題はおそらくCardオブジェクトにあると思います

  • デフォルトのコンストラクタがない場合があります
  • デフォルトのコンストラクタがない場合は、@ JsonCreatorを使用して注釈を付ける必要があります

[〜#〜] edit [〜#〜]2つのことがあります。
*セッターはありません。
*フィールドを設定できるパブリックコンストラクターがありません。

(合法的な)手段を与えない場合、デシリアライザーはどのようにフィールドにデータを取り込む必要がありますか?

ソリューション:
->公開セッターをクラスに追加します
->または@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); }     
}     
39
ppeterka

先日同じ症状があり、JsonCreatorJsonPropertyについてアドバイスを受けましたが、まったく同じエラーメッセージが表示されました。私が取り組んでいるプロジェクトでは、jacksonのfasterxmlバージョンとcodehausバージョンを使用していることがわかりました。クラスにcodehaus属性を設定しましたが、fasterxmlのObjectMapperを使用して解析を行いました。彼らは、推移的な依存関係を喜びます。

9
Tim Stewart

私は同じような問題に直面しています。私のJsonデータセットは次のようなものです

 {
 "count":1917、
 "data":
 {
 "id": "1"、
 "generated_id": "Z1-1156"、
 "first_name": "Maruf"、
 "last_name": "Ahmed"、
 "full_name": "Mr. Maruf Ahmed "、
" email ":" [email protected] "、
" phone ":" +8801676798306 "、
" company_name ":" SM Style Ltd. "、 
 "website": "http:\\/\\/smartex-bd.com \\ /"、
 "address": "\\\ n道路番号:5家番号:18\\\ nレベル:3 \\\ nレーン:\\\ nBlock:F \\\ nSector:2 \\\ nArea:Mirpur \\\ nDhaka 1216 \\\ nMirpur \\\ nBangladesh "、
" industry_type ":"アパレル小売店 "、
" job_title ":"デザイナー "、
"部署 ":"研究開発 "、
"日付 ":" 7 \\/10 \\/2015 1:04:43 PM "
}、
 {
" id ":" 2 "、
" generated_id ":" Z2-1157 "、
" first_name ":" Akramul "、
" last_name ":" Hoque "、
" full_name ":" Mr. Akramul Hoque "、
" Eメール":" [email protected] "、
" 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(シニア) "、
" department ":" Merchandising "、
" date ":" 7 \\/9 \\/2015 10:56:22 PM "
} 
 
} 
        @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として宣言しました。それは私のために働いた。

6
Ratul Sharker

クラスの1つでデフォルトコンストラクターが欠落していると思います。
別の方法:@JsonCreatorアノテーションをコンストラクターに追加します

3
urir

Cardクラスを調べてください-ほとんどの場合、アクセス可能なデフォルトコンストラクターがないか、コンストラクターに適切なマッピングがありません。

1