„JsonMappingException“: nėra tinkamo tipo konstruktoriaus, kurio tipas [paprastas tipas, klasė]: negali sukurti egzemplioriaus iš JSON objekto

Bandant gauti JSON užklausą ir ją apdoroti gaunu šią klaidą:

org.codehaus.jackson.map.

Čia yra JSON, kurį bandau siųsti:

02 окт. nustatė Lucky Murari 02 okt. 2011-10-02 13:16 '11, 13:16 pm 2011-10-02 13:16
@ 10 atsakymų

Taigi galiausiai supratau, kokia problema. Aš neabejoju, kad tai nėra problema Jackson.

Tiesą sakant, problema buvo „ Apple“ . Klasė:

 public class ApplesDO { private String apple; public String getApple() { return apple; } public void setApple(String apple) { this.apple = apple; } public ApplesDO(CustomType custom) { //constructor Code } } 

Klasei sukurtas individualus konstruktorius, kuris tampa numatytuoju konstruktoriumi. Stub konstruktoriaus vaizdas sukėlė klaidą:

 public class ApplesDO { private String apple; public String getApple() { return apple; } public void setApple(String apple) { this.apple = apple; } public ApplesDO(CustomType custom) { //constructor Code } //Introducing the dummy constructor public ApplesDO() { } } 
447
02 окт. atsakė Lucky Murari 02 okt. 2011-10-02 17:15 '11, 17:15, 2011-10-02 17:15

Taip atsitinka dėl šių priežasčių:

border=0
  • jūsų vidinė klasė turėtų būti apibrėžta kaip statinė

     private static class Conditiont { //jackson specific } 
  • Galbūt jūsų klasėje neturite numatytojo konstruktoriaus ( UPDATE: tai atrodo neteisinga)

     private static class Condition { private Long id; public Condition() { } // Setters and Getters } 
  • Jūsų nustatymai gali būti netinkamai apibrėžti arba rodomi (pvz., Privatus nustatytuvas)

280
14 сент. atsakymas, kurį pateikė azerafati 14 sep . 2014-09-14 12:20 '14, 12:20 2014-09-14 12:20

Norėčiau pridėti dar vieną sprendimą, kuris nereikalauja statybininko. Kadangi statybininkai yra šiek tiek supainioti ir vėliau supainioti. Mes galime pateikti saugų konstruktorių ir komentuoti konstruktoriaus argumentus, leisime „jackson“ nustatyti konstruktoriaus parametro ir lauko kartografavimą.

taip bus ir toliau. Atminkite, kad anotacijos viduje esanti eilutė turi atitikti lauko pavadinimą.

 import com.fasterxml.jackson.annotation.JsonProperty; public class ApplesDO { private String apple; public String getApple() { return apple; } public void setApple(String apple) { this.apple = apple; } public ApplesDO(CustomType custom){ //constructor Code } public ApplesDO(@JsonProperty("apple")String apple) { } } 
48
26 нояб. Atsakymą pateikė PiersyP 26 lapkritis. 2014-11-26 15:15 '14, 15:15 2014-11-26 15:15

Kai susidūriau su šia problema, tai buvo bandymas naudoti vidinę klasę DO. Vidinės klasės kūrimas (tyliai) reikalavo, kad „Jackson“ neturėjo egzaminų.

Šiuo atveju vidinės klasės perkėlimas į savo .java failą išsprendžia problemą.

22
17 сент. atsakymas pateikiamas 17 ženklų . 2015-09-17 04:01 '15 - 4: 01: 2015-09-17 04:01

Ar galite patikrinti šią struktūrą. Jei teisingai prisimenu, galite jį naudoti taip:

 { "applesRequest": { "applesDO": [ { "apple": "Green Apple" }, { "apple": "Red Apple" } ] } } 

Antra, pridėkite numatytąjį konstruktorių kiekvienai klasei, kurią ji taip pat gali padėti.

9
02 окт. atsakymas danny.lesnik 02 okt. 2011-10-02 13:40 '11 at 13:40 2011-10-02 13:40

Nykščio taisyklė Pridėkite numatytąjį konstruktorių kiekvienai klasei, kurią naudojote kaip kartografavimo klasę. Jūs praleidote ir pateko į bėdą!
Tiesiog pridėkite numatytąjį konstruktorių ir jis turėtų veikti.

6
29 дек. Atsakymą pateikė Badal gruodžio 29 d. 2014-12-29 09:35 '15, 9:35 2014-12-29 09:35

Jei pradedate anotuoti konstruktorių, turite pažymėti visus laukus.

Atkreipkite dėmesį: lauke „Staff.name“ rodomas „ANOTHER_NAME“ JSON eilutėje.

  String jsonInString="{\"ANOTHER_NAME\":\"John\",\"age\":\"17\"}"; ObjectMapper mapper = new ObjectMapper(); Staff obj = mapper.readValue(jsonInString, Staff.class); // print to screen public static class Staff { public String name; public Integer age; public Staff() { } //@JsonCreator - don't need this public Staff(@JsonProperty("ANOTHER_NAME") String n,@JsonProperty("age") Integer a) { name=n;age=a; } } 
4
10 сент. Atsakyti Vortex Sep 10 2016-09-10 09:16 '16 at 9:16 am 2016-09-10 09:16

Mūsų modelių klasėje reikia sukurti tuščią konstruktorių. Todėl, kai „Json“ atitinka, jis nustatomas naudojant setter metodą.

3
03 мая '17 в 15:11 2017-05-03 15:11 Atsakymas, kurį pateikė Suresh Patil 03 May '17 at 15:11 2017-05-03 15:11

Jūs turite suprasti, ką „Jackson“ variantai yra prieinami deserializacijai. „Java“ metodas argumentų pavadinimų nėra. Todėl Džeksonas paprastai negali naudoti konstruktorių, kad sukurtų gerai apibrėžtą objektą su visa, kas jau įdiegta.

Taigi, jei yra tuščias konstruktorius ir yra ir steigėjų, jis naudoja tuščią konstruktorių ir steigėjus. Jei nėra nustatymų, tam naudojamas tam tikras tamsus magija (atspindys).

Jei norite naudoti „Jackson“ konstruktorių, turite naudoti komentarus, kaip minėta @PiersyP atsakyme. Taip pat galite naudoti statytojo modelį. Jei susiduriate su kai kuriomis išimtimis, sėkmės. Klaidų tvarkymas Džeksone trunka daug laiko, sunku suprasti, kad klaidų pranešimuose gibberis.

1
09 авг. atsakymas pateikiamas Vlasec 09 rug . 2016-08-09 13:15 '16, 13:15 pm 2016-08-09 13:15

„Jackson“ serializatorių / deserializatorių gedimas taip pat gali būti problema. Nors tai nėra jūsų atvejis, verta paminėti.

Aš susidūriau su ta pačia išimtimi, ir tai buvo.

0
14 янв. atsakymą pateikė Artem Novikov . 2016-01-14 02:03 '16 at 2:03 2016-01-14 02:03

Kiti klausimai apie žymi arba Užduoti klausimą