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

カードオブジェクトに問題がある可能性が最も高いと思います

編集 私には2つのことが
あります:*セッターがありません。
* フィールドを設定できる public コンストラクターがありません。

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

解決策:
-> パブリック セッターをクラスに追加する
-> または @JsonCreator で注釈を付けたパラメーター化されたコンストラクターを作成する

*: もちろん、パーサーは反射的な「可視性を変更する」トリックを行うことができますが、これは「本来のプレイ方法」ではありません。

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); }     
}     
于 2012-10-11T09:17:50.410 に答える
11

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

于 2014-08-14T16:30:45.327 に答える
6

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

{
"カウント": 1917,
  "データ": [
    {
      "id": "1",
      "Generated_id": "Z1-1156",
      "first_name": "マルフ",
      "last_name": "アーメド",
      "full_name": "マルフ アーメドさん",
      "email": "maruf1990@gmail.com",
      "電話": "+8801676798306",
      "company_name": "SM Style Ltd.",
      "website": "http:\\/\\/smartex-bd.com\\/",
      "address": "\\\n道路番号:5 家屋番号:18\\\nレベル:3\\\nレーン:\\\nブロック:F\\\nセクター:2\\\nエリア:ミルプール\\\nダッカ 1216 \\\nミルプール\\\nバングラデシュ",
      "industry_type": "アパレル小売業者",
      "job_title": "デザイナー",
      "部門": "研究開発",
      "date": "7\\/10\\/2015 1:04:43 PM"
    }、
    {
      "id": "2",
      "Generated_id": "Z2-1157",
      "first_name": "アクラムル",
      "last_name": "ホーク",
      "full_name": "Akramul Hoqueさん",
      "email": "akram@nassagroup.org",
      "電話": "+8801732005564",
      "company_name": "ナッサグループ",
      "ウェブサイト": "www,nassagroup.org",
      "address": "Nassa Group\\\nRoad No:238 House No:\\\nLevel:\\\nLane:\\\nBlock:\\\nSector:\\\nArea:Gulshan li\\\nDhaka 1208\ \\nテジャオン工業地帯\\\nバングラデシュ",
      "industry_type": "デニム衣料品メーカー",
      "job_title": "マーチャンダイザー (シニア)",
      "部門": "マーチャンダイジング",
      "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。それは私のために働いた。

于 2015-08-05T19:08:19.100 に答える
3

クラスの1つにデフォルトのコンストラクターがないと思います。
または、 @JsonCreator アノテーションをコンストラクターに追加します。

于 2012-10-11T09:15:21.553 に答える
1

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

于 2012-10-11T09:15:47.413 に答える