Подтвердить что ты не робот

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(); }
}
4b9b3361

Ответ 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

Посмотрите на свой класс карты - скорее всего, нет доступного конструктора или конструктора по умолчанию, у которого нет правильных сопоставлений.