Jackson - JsonMappingException из-за конструктора
При попытке десериализации JSON
возникает следующее исключение:
Не найден подходящий конструктор для типа [simple type, class MyObj$obj$Card]:
не может быть создан из объекта JSON (нужно добавить/включить информацию о типе?) в [Source: [email protected]; 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[]
не создает исключения, но у него отсутствует правильное сопоставление, которое я хочу получить.
Любой ключ, как я могу его решить? Отрывок будет БОЛЬШИМ!
Что означает эта ошибка?
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(); }
}
Ответы
Ответ 1
Я думаю, что проблема, скорее всего, связана с Картой.
- у него может не быть конструктора по умолчанию
- Если у него нет конструктора по умолчанию, его следует аннотировать с помощью @JsonCreator
ИЗМЕНИТЬ
У меня есть две вещи:
* У вас нет сеттеров.
* у вас нет публичного конструктора, которому будет разрешено устанавливать ваши файлы.
Как десериализатор заполняет ваши поля, если вы не даете ему никаких (юридических *) средств для этого?
Решения:
- > добавить публичных сеттеров в классы
- > или создать параметризованные конструкторы, аннотированные с помощью @JsonCreator
*: конечно, синтаксический анализатор мог сделать рефлексивный трюк "mofidy the visibility", но давайте, это не "способ, которым это предназначено для воспроизведения"
EDIT2
Я думаю, что это должно сработать, но я не могу его протестировать - у меня нет проекта под рукой, с которым Джексон правильно настроен сейчас (это только часть его, но я думаю, что легко понять, что я хотел show.) Заметьте, я изменил массив на List:
@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); }
}
Ответ 2
У меня были те же симптомы на днях, и я посоветовал JsonCreator
и JsonProperty
, но получил то же точное сообщение об ошибке. Оказывается, проект, над которым я работаю, использует версии quickxml и codehaus для джексона. Я поместил атрибуты codehaus в свой класс, но использовал quickxml ObjectMapper для синтаксического анализа. Они радуют транзитивных зависимостей.
Ответ 3
Я столкнулся с такой же проблемой. Мой набор данных 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": "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": "[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 (Senior)",
"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
. Это сработало для меня.
Ответ 4
Я думаю, что у вас отсутствует конструктор по умолчанию в одном из классов.
Альтернативно: добавьте аннотацию @JsonCreator к конструкторам
Ответ 5
Посмотрите на свой класс карты - скорее всего, нет доступного конструктора или конструктора по умолчанию, у которого нет правильных сопоставлений.