web-dev-qa-db-fra.com

Jackson - JsonMappingException due au constructeur

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

Je pense que le problème est le plus probable avec l'objet Card

  • il peut ne pas avoir de constructeur par défaut
  • s'il n'a pas de constructeur par défaut, il doit être annoté en utilisant @ JsonCreator

[~ # ~] 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); }     
}     
39
ppeterka

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.

9
Tim Stewart

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.

6
Ratul Sharker

Je pense que votre constructeur par défaut manque dans l'une des classes.
Alternativement: ajoutez l'annotation @JsonCreator aux constructeurs

3
urir

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.

1