J'ai l'exception suivante lorsque j'essaie de désérialiser un JSON
Aucun constructeur approprié trouvé pour le type
[simple type, class MyObj$obj$Card]:
Ne peut pas instancier à partir de l'objet JSON (besoin d'ajouter/activer les informations de type?) À[Source: Java.io.StringReader@4344ee21; line: 1, column: 201]
(Via la chaîne de référence:MyObj["obj"]->Obj["cards"]
)
Et le JSON est
{
"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
}
]
}
]
}
}
Et dans la classe Obj
j'ai la déclaration suivante
@JsonProperty("cards") private Card[] cards;
Ce qui produit l'exception ci-dessus. Changer le type Card[]
En Object[]
Ne produit pas d'exception, mais il manque le mappage correct que je souhaite obtenir.
Un indice comment puis-je le résoudre? Un extrait sera GRAND! Qu'est-ce que cette erreur signifie de toute façon?
MISE À JOUR
J'ai inclus la classe 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(); }
}
Je pense que le problème est le plus probable avec l'objet Card
[~ # ~] modifier [~ # ~] J'ai deux choses:
* vous n'avez pas de poseurs.
* vous n'avez pas de constructeur public qui serait autorisé à définir vos fichiers.
Comment le désérialiseur doit-il remplir vos champs si vous ne lui donnez aucun moyen (légal *) pour cela?
Solutions:
-> ajouter des setters publics aux classes
-> ou créez des constructeurs paramétrés annotés avec @JsonCreator
*: bien sûr, l'analyseur pourrait faire le tour de réflexion "mofidy la visibilité", mais allez, ce n'est pas "la façon dont il est censé être joué"
EDIT2 Je pense que cela devrait fonctionner, mais je ne peux pas le tester - Je n'ai pas de projet à portée de main avec Jackson correctement configuré maintenant (ce n'en est qu'une partie, mais je pense qu'il est facile d'interpréter ce que je voulais montrer.) Remarque, j'ai changé le tableau en Liste:
@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); }
}
J'ai eu les mêmes symptômes l'autre jour et j'ai suivi les conseils sur JsonCreator
et JsonProperty
mais j'ai eu le même message d'erreur exact. Il s'avère que le projet sur lequel je travaille utilise des versions de Jacksonx plus rapides et plus codées. J'ai mis les attributs de codehaus sur ma classe mais j'ai utilisé l'ObjectMapper de fastxml pour faire l'analyse. Ils se réjouissent des dépendances transitives.
J'ai été confronté au même genre de problème. Mon ensemble de données Json est comme suit
{ "nombre": 1917, "données": { "id": "1", "id_généré": "Z1-1156", "prénom": "Maruf", "nom_famille": "Ahmed", "nom_complet": "M. Maruf Ahmed ", " Email ":" [email protected] ", " Phone ":" +8801676798306 ", " Company_name ":" SM Style Ltd. ", "site Web": "http: \\/\\/smartex-bd.com \\ /", "adresse": "\\\ nRoad No: 5 House No: 18\\\ nLevel: 3 \\\ nLane: \\\ nBlock: F \\\ nSector: 2 \\\ nArea: Mirpur \\\ nDhaka 1216 \\\ nMirpur \\\ nBangladesh ", " industry_type ":" Détaillant de vêtements ", " Job_title ":" Designer ", " Département ":" Recherche et développement ", " Date ":" 7 \\/10 \\/2015 1:04:43 PM " }, { " Id ":" 2 ", " Generate_id ":" Z2-1157 ", " prénom ":" Akramul ", " nom_de-famille ":" Hoque ", " nom_complet ":" M. Akramul Hoque ", " email ":" [email protected] ", " téléphone ":" +8801732005564 ", " company_name ":" Nassa Group ", " website ":" www, nassagroup.org ", " adresse ":" Groupe Nassa \\\ nN ° de route: 238 N ° de maison: \\\ nNiveau: \\\ nPiste: \\\ nBloc: \\\ nSecteur: \\\ nArea: Gulshan li \\\ nDhaka 1208 \\\ nTejgaon Industrial Area \\\ nBangladesh ", " industry_type ":" Denim Garments Manufacturer ", " job_title ":" Merchandiser (Senior) ", " service ":" 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;
}
}
Le problème était la déclaration de classe interne, elle devrait être statique. Parce que jackson doit y accéder comme
new Visitors.Visitor();
j'ai donc déclaré la classe intérieure Visitor
comme static
. Ça a marché pour moi.
Je pense que votre constructeur par défaut manque dans l'une des classes.
Alternativement: ajoutez l'annotation @JsonCreator aux constructeurs
Regardez dans votre classe Card - très probablement il n'y a pas de constructeur par défaut accessible ou le constructeur manque de mappages appropriés.