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(); }
}
_
問題はおそらくCardオブジェクトにあると思います
[〜#〜] 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); }
}
先日同じ症状があり、JsonCreator
とJsonProperty
についてアドバイスを受けましたが、まったく同じエラーメッセージが表示されました。私が取り組んでいるプロジェクトでは、jacksonのfasterxmlバージョンとcodehausバージョンを使用していることがわかりました。クラスに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 ":" [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
として宣言しました。それは私のために働いた。
クラスの1つでデフォルトコンストラクターが欠落していると思います。
別の方法:@JsonCreatorアノテーションをコンストラクターに追加します
Cardクラスを調べてください-ほとんどの場合、アクセス可能なデフォルトコンストラクターがないか、コンストラクターに適切なマッピングがありません。