แจ็กสันกับ JSON: ฟิลด์ที่ไม่รู้จักไม่ถูกทำเครื่องหมายว่าเพิกเฉย


676

ฉันต้องแปลงสตริง JSON ให้เป็นวัตถุ Java ฉันใช้ Jackson สำหรับการจัดการ JSON ฉันไม่สามารถควบคุมอินพุต JSON ได้ (ฉันอ่านจากเว็บเซอร์วิส) นี่คืออินพุต JSON ของฉัน:

{"wrapper":[{"id":"13","name":"Fred"}]}

นี่คือกรณีการใช้งานที่เรียบง่าย:

private void tryReading() {
    String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
    ObjectMapper mapper = new ObjectMapper();  
    Wrapper wrapper = null;
    try {
        wrapper = mapper.readValue(jsonStr , Wrapper.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("wrapper = " + wrapper);
}

คลาสเอนทิตีของฉันคือ:

public Class Student { 
    private String name;
    private String id;
    //getters & setters for name & id here
}

คลาสของ Wrapper ของฉันนั้นเป็นวัตถุคอนเทนเนอร์เพื่อให้ได้รายชื่อนักเรียนของฉัน:

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

ฉันได้รับข้อผิดพลาดนี้และ "เสื้อคลุม" nullผลตอบแทน ฉันไม่แน่ใจว่ามีอะไรขาดหายไป ใครช่วยได้บ้าง

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
    Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
 at [Source: java.io.StringReader@1198891; line: 1, column: 13] 
    (through reference chain: Wrapper["wrapper"])
 at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
    .from(UnrecognizedPropertyException.java:53)

2
ฉันพบว่ามีประโยชน์ในการหลีกเลี่ยงการสร้างคลาส wrapper: Map dummy<String,Student> = myClientResponse.getEntity(new GenericType<Map<String, Student>>(){});แล้วStudent myStudent = dummy.get("wrapper");
pulkitsinghal

6
JSON ควรมีลักษณะดังนี้: String jsonStr = "{\" students \ "\: [{\" id \ ": \" 13 \ ", \" ชื่อ \ ": \" Fred \ "}]}"; หากคุณคาดหวังว่าวัตถุ Wrapper ในคำขอ REST POST ของคุณ
Dmitri Algazin

2
คำถามที่เกี่ยวข้อง (แต่แตกต่างกัน): ละเว้นฟิลด์ใหม่บนวัตถุ JSON โดยใช้ Jackson
sleske

5
และโดยบังเอิญคำตอบส่วนใหญ่สำหรับคำถามนี้จริง ๆ แล้วตอบคำถามที่แตกต่างกันคือหนึ่งคล้ายกับที่ฉันลิงค์ข้างต้น
sleske

4
คำตอบส่วนใหญ่ช่วยแก้ไขปัญหาแปรงใต้พรมปูพื้นแทนที่จะแก้ไขได้จริง :(
NoobEditor

คำตอบ:


992

คุณสามารถใช้คำอธิบายประกอบระดับของแจ็คสัน:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

มันจะเพิกเฉยต่อทรัพย์สินที่คุณยังไม่ได้กำหนดใน POJO ของคุณ มีประโยชน์มากเมื่อคุณกำลังมองหาคุณสมบัติสองสามอย่างใน JSON และไม่ต้องการเขียนการแมปทั้งหมด ข้อมูลเพิ่มเติมได้ที่เว็บไซต์ของแจ็คสัน หากคุณต้องการเพิกเฉยต่อคุณสมบัติที่ไม่ได้ประกาศใด ๆ คุณควรเขียน:

@JsonIgnoreProperties(ignoreUnknown = true)

9
เอเรียลมีวิธีใดที่จะประกาศสิ่งนี้กับคนภายนอก
Jon Lorusso

4
ฉันกำลังทำให้คลาสเป็นอนุกรมที่ฉันไม่ได้เป็นเจ้าของ (ไม่สามารถแก้ไขได้) ในมุมมองหนึ่งฉันต้องการทำให้เป็นอนุกรมกับชุดของฟิลด์ที่แน่นอน ในมุมมองอื่นฉันต้องการชุดของเขตข้อมูลที่แตกต่างกันต่อเนื่อง (หรืออาจเปลี่ยนชื่อคุณสมบัติใน JSON)
Jon Lorusso

11
ฉันต้องเพิ่มว่าคุณจำเป็นต้องใช้(ignoreUnknown = true)เมื่อใส่คำอธิบายประกอบชั้นของคุณมิฉะนั้นมันจะไม่ทำงาน
หมอผี

85
Juliánนี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามของ OP อย่างไรก็ตามฉันสงสัยว่าผู้คนมาที่นี่เพราะพวกเขา google จะเพิกเฉยต่อคุณสมบัติที่ไม่ได้กำหนดไว้ใน POJO และนี่คือผลลัพธ์แรกดังนั้นพวกเขาจึงลงเอยด้วยการลงคะแนนนี้และการตอบกลับของ Suresh (นั่นคือสิ่งที่เกิดขึ้นกับฉัน) แม้ว่าคำถามเดิมไม่มีส่วนเกี่ยวข้องกับการต้องการละเว้นคุณสมบัติที่ไม่ได้กำหนด
Ric Jafe

5
นี่เป็นการตั้งค่าเริ่มต้นที่โง่มากหากคุณเพิ่มคุณสมบัติให้กับ api ของคุณการทำให้เป็นอนุกรมทั้งหมดล้มเหลว
headsvk

481

คุณสามารถใช้ได้

ObjectMapper objectMapper = getObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

มันจะละเว้นคุณสมบัติทั้งหมดที่ไม่ได้ประกาศ


5
สิ่งนี้ไม่ได้ผลสำหรับฉันมันยังคงล้มเหลวในคุณสมบัติที่ไม่รู้จัก
เดนิส Kniazhev

1
คุณช่วยวางรหัสอย่างน้อยสิ่งที่คุณกำลังทำอยู่คุณอาจพลาดบางสิ่งบางอย่างที่นั่น .. ไม่ว่าจะโดยการทำเช่นนี้หรือโดยใช้ "@JsonIgnoreProperties (เพิกเฉยไม่ทราบ = จริง)" ปัญหาของคุณควรได้รับการแก้ไข อย่างไรก็ตามโชคดี
Suresh

27
FWIW - ฉันต้องนำเข้า enum ที่แตกต่างกันเล็กน้อยนี้: org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES
raf

9
^ Above สำหรับรุ่น Jackson ก่อนวันที่ 2
755

10
คุณสามารถ
เชื่อมโยงการ

126

คำตอบแรกนั้นเกือบจะถูกต้อง แต่สิ่งที่จำเป็นคือการเปลี่ยนเมธอด getter, ไม่ใช่ฟิลด์ - ฟิลด์เป็นแบบส่วนตัว (และไม่ตรวจจับอัตโนมัติ); เพิ่มเติม getters มีความสำคัญเหนือกว่าช่องถ้ามองเห็นทั้งคู่ (มีหลายวิธีในการทำให้ฟิลด์ส่วนตัวมองเห็นได้เช่นกัน แต่ถ้าคุณต้องการให้มี getter ก็ไม่มีประเด็นมากนัก)

ดังนั้นผู้ทะเยอทะยานควรตั้งชื่อgetWrapper()หรือทำหมายเหตุประกอบด้วย:

@JsonProperty("wrapper")

หากคุณต้องการชื่อวิธี getter ตามที่เป็นอยู่


กรุณาอธิบายอย่างละเอียด - ผู้ต้องการ getter ใดที่จะต้องเปลี่ยนหรือใส่คำอธิบายประกอบ?
Frans

คุณหมายถึงข้อเขียนด้วย @JsonGetter ("wrapper") ใช่ไหม?
pedram bashiri

@pedrambashiri @JsonPropertyไม่มีผมหมายถึง ในขณะที่@JsonGetterเป็นนามแฝงทางกฎหมายก็ไม่ค่อยได้ใช้เป็น@JsonPropertyงานสำหรับ getters, setters และสาขา; setters และ getters สามารถแยกแยะได้ด้วยลายเซ็น (อันหนึ่งไม่มีข้อโต้แย้งส่งกลับไม่ใช่โมฆะส่วนอื่น ๆ ใช้หนึ่งอาร์กิวเมนต์)
StaxMan

นี่คือคำตอบที่ฉันกำลังมองหา! เสียงเหมือนแจ็คสันมีปัญหาในการจับคู่แหล่งที่มาของ JSON กับ POJO ของคุณ แต่คุณสามารถรับประกันการจับคู่โดยการติดแท็กที่ getters ขอบคุณ!
Andrew Kirna

90

ใช้ Jackson 2.6.0 สิ่งนี้ใช้ได้กับฉัน:

private static final ObjectMapper objectMapper = 
    new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

และด้วยการตั้งค่า:

@JsonIgnoreProperties(ignoreUnknown = true)

12
ด้วยหมายเหตุประกอบการกำหนดค่านั้นไม่จำเป็น
newWorld

คุณต้องการกำหนดค่าทั้ง ObjectMapper และ Annotation ในคลาสหรือไม่? ฉันเดา objectMapper จะแก้ไขให้ทุกคนโดยไม่จำเป็นต้องใส่หมายเหตุประกอบในแต่ละคลาส ฉันใช้คำอธิบายประกอบ
prayagupd

คุณไม่จำเป็นต้องตั้งค่าทั้งสองในคลาสเดียวกัน คุณอาจใช้ DI เพื่อรับอินสแตนซ์เดี่ยวของส่วนกลางObjectMapperเพื่อตั้งค่าFAIL_ON_UNKNOWN_PROPERTIESคุณสมบัติส่วนกลาง
user991710

คุณไม่จำเป็นต้องใช้ทั้งคู่คุณสามารถเลือกอย่างใดอย่างหนึ่ง
heez

58

สามารถทำได้ 2 วิธี:

  1. ทำเครื่องหมาย POJO เพื่อละเว้นคุณสมบัติที่ไม่รู้จัก

    @JsonIgnoreProperties(ignoreUnknown = true)
  2. กำหนดค่า ObjectMapper ที่ทำให้เป็นอนุกรม / ยกเลิกการจัดอันดับ POJO / json ดังต่อไปนี้:

    ObjectMapper mapper =new ObjectMapper();            
    // for Jackson version 1.X        
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // for Jackson version 2.X
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

2
ทำไมนี่จึงเป็นคำตอบที่ยอมรับได้? นี่เป็นเพียงการบอกให้เพิกเฉยต่อคุณสมบัติที่ไม่รู้จักในขณะที่คำถามก็คือการหาวิธีที่จะทำให้ json ถูกห่อไว้ในวัตถุซึ่งโซลูชันนี้บอกอย่างชัดเจนว่าจะไม่สนใจ
Sayantan

42

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(
    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

@JsonIgnoreProperties(ignoreUnknown = true) คำอธิบายประกอบไม่ได้


2
ลงต่ำเนื่องจากไม่ตอบคำถามของ OP การเพิกเฉยต่อคุณสมบัติที่ไม่รู้จักไม่สามารถแก้ปัญหาของเขาได้ แต่ทำให้เขามีWrapperตัวอย่างที่รายชื่อนักเรียนnullว่างเปล่า
ฟราน

37

มันใช้งานได้ดีกว่าทั้งหมดโปรดดูที่คุณสมบัตินี้

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    projectVO = objectMapper.readValue(yourjsonstring, Test.class);

ทำงานตามที่คาดไว้!
MADHAIYAN ม

ใช่นี่คือสิ่งที่แก้ไขปัญหาของฉัน - ซึ่งตรงกับชื่อของโพสต์นี้
Scott Langeberg

คำตอบใช้ได้ดีสำหรับฉันและมันง่ายมากขอบคุณ
โทยะอากิระ

29

หากคุณใช้งาน Jackson 2.0

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

ทำไมการตั้งค่านี้จึงไม่มีผลกับฉัน
zhaozhi

@zhaozhi มันขึ้นอยู่กับรุ่นของแจ็คสัน
Aalkhodiry

20

ตามเอกสารคุณสามารถละเว้นฟิลด์ที่เลือกหรือฟิลด์ uknown ทั้งหมด:

 // to prevent specified fields from being serialized or deserialized
 // (i.e. not include in JSON output; or being set even if they were included)
 @JsonIgnoreProperties({ "internalId", "secretKey" })

 // To ignore any unknown properties in JSON input without exception:
 @JsonIgnoreProperties(ignoreUnknown=true)

15

มันทำงานให้ฉันด้วยรหัสต่อไปนี้:

ObjectMapper mapper =new ObjectMapper();    
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

15

การเพิ่ม setters และ getters แก้ไขปัญหาสิ่งที่ฉันรู้สึกว่าเป็นปัญหาจริงคือวิธีแก้ปัญหา แต่ไม่ใช่วิธีที่จะระงับ / เพิกเฉยต่อข้อผิดพลาด ฉันได้รับข้อผิดพลาด " ฟิลด์ที่ไม่รู้จัก .. ไม่ได้ทำเครื่องหมายว่าเพิกเฉย .. "

แม้ว่าฉันจะใช้คำอธิบายประกอบด้านล่างด้านบนของชั้นเรียน แต่ก็ไม่สามารถแยกวิเคราะห์วัตถุ json และให้ฉันป้อน

@JsonIgnoreProperties (เพิกเฉย = จริง)

จากนั้นฉันก็รู้ว่าฉันไม่ได้เพิ่ม setters และ getters หลังจากเพิ่ม setters และ getters ให้กับ "Wrapper" และไปที่ "Student" มันใช้งานได้อย่างมีเสน่ห์


นี่ดูเหมือนจะเป็นคำตอบเดียวที่ตอบคำถามได้จริง คำตอบอื่น ๆ ทั้งหมดกำลังทำเครื่องหมายคุณสมบัติที่ไม่รู้จักว่าถูกละเว้น แต่ 'wrapper' ไม่ใช่คุณสมบัติที่ไม่รู้จักมันเป็นสิ่งที่เราพยายามแยกวิเคราะห์
lbenedetto

14

แจ็กสันบ่นเพราะไม่สามารถหาทุ่งใน Wrapper ในชั้นเรียนของคุณที่เรียกว่า "wrapper" มันทำเช่นนี้เพราะวัตถุ JSON ของคุณมีคุณสมบัติที่เรียกว่า "wrapper"

ฉันคิดว่าการแก้ไขคือการเปลี่ยนชื่อฟิลด์คลาส Wrapper ของคุณเป็น "wrapper" แทนที่จะเป็น "students"


ขอบคุณจิม ฉันลองมันและมันก็ไม่ได้แก้ปัญหา ผมสงสัยว่าถ้าฉันหายไปบางคำอธิบายประกอบ ..
jshree

1
หืมเกิดอะไรขึ้นเมื่อคุณสร้างข้อมูลที่เทียบเท่าใน Java แล้วใช้ Jackson เขียนออกมาใน JSON ความแตกต่างใด ๆ ระหว่าง JSON นั้นกับ JSON ข้างต้นควรเป็นเงื่อนงำว่าเกิดอะไรขึ้น
Jim Ferrans

คำตอบนี้ใช้ได้สำหรับฉันด้วยตัวอย่างจากคำถาม
sleske

14

ฉันลองใช้วิธีการด้านล่างและใช้งานได้กับการอ่านรูปแบบ JSON กับแจ็คสัน ใช้โซลูชันที่แนะนำแล้วของ: หมายเหตุประกอบ getter ด้วย@JsonProperty("wrapper")

คลาส wrapper ของคุณ

public Class Wrapper{ 
  private List<Student> students;
  //getters & setters here 
} 

คำแนะนำของฉันสำหรับคลาส wrapper

public Class Wrapper{ 

  private StudentHelper students; 

  //getters & setters here 
  // Annotate getter
  @JsonProperty("wrapper")
  StudentHelper getStudents() {
    return students;
  }  
} 


public class StudentHelper {

  @JsonProperty("Student")
  public List<Student> students; 

  //CTOR, getters and setters
  //NOTE: If students is private annotate getter with the annotation @JsonProperty("Student")
}

อย่างไรก็ตามสิ่งนี้จะให้ผลลัพธ์ของรูปแบบ:

{"wrapper":{"student":[{"id":13,"name":Fred}]}}

นอกจากนี้สำหรับข้อมูลเพิ่มเติมโปรดดูที่https://github.com/FasterXML/jackson-annotations

หวังว่านี่จะช่วยได้


ยินดีต้อนรับสู่ stackoverflow เคล็ดลับคุณสามารถใช้{}สัญลักษณ์ในแถบเครื่องมือเพื่อจัดรูปแบบตัวอย่างโค้ดของคุณ
Leigh

11

วิธีการแก้ปัญหานี้เป็นเรื่องทั่วไปเมื่ออ่านกระแส json และต้องได้รับเพียงบางฟิลด์ในขณะที่เขตข้อมูลที่ไม่ได้แมปอย่างถูกต้องในระดับโดเมนของคุณสามารถละเว้น:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)

โซลูชันอย่างละเอียดจะใช้เครื่องมือเช่น jsonschema2pojo เพื่อสร้างคลาสโดเมนที่ต้องการโดยอัตโนมัติเช่น Student จาก Schema ของ json Response คุณสามารถทำหลังโดย json ออนไลน์เพื่อแปลง schema


10

ใส่คำอธิบายประกอบลงในฟิลด์นักเรียนด้านล่างเนื่องจากมีความไม่ตรงกันในชื่อของคุณสมบัติ json และคุณสมบัติ java

public Class Wrapper {
    @JsonProperty("wrapper")
    private List<Student> students;
    //getters & setters here
}

9

อย่างที่ไม่มีใครพูดถึงฉันคิดว่าฉันจะ ...

ปัญหาคือคุณสมบัติของคุณใน JSON ของคุณเรียกว่า "wrapper" และคุณสมบัติของคุณใน Wrapper.class เรียกว่า "students"

ดังนั้นทั้ง ...

  1. แก้ไขชื่อของคุณสมบัติในคลาสหรือ JSON
  2. อธิบายตัวแปรคุณสมบัติของคุณตามความคิดเห็นของ StaxMan
  3. อธิบาย setter (ถ้าคุณมี)

6

ชุดของประชาชนเขตชั้นเรียนของคุณไม่ส่วนตัว

public Class Student { 
    public String name;
    public String id;
    //getters & setters for name & id here
}

2
การปฏิบัติที่ไม่ดี - สิ่งนี้จะทำลายการห่อหุ้ม
Downhillski

1
ฉันได้ยินมาว่า
Downhillski

คลาสของคุณมีความเสี่ยงเมื่อผู้ใช้ใช้เนื่องจากสถานะภายในสามารถกลายพันธุ์ผ่านฟิลด์เหล่านี้
Downhillski

5

สิ่งที่ใช้ได้ผลสำหรับฉันคือการเผยแพร่สู่สาธารณะ มันแก้ไขปัญหาให้ฉัน


1
ทำงานให้ฉัน: D
TienLuong

5

ทั้งเปลี่ยน

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

ถึง

public Class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

---- หรือ ----

เปลี่ยนสตริง JSON ของคุณเป็น

{"students":[{"id":"13","name":"Fred"}]}

5

ข้อมูลของคุณ

{"wrapper":[{"id":"13","name":"Fred"}]}

ระบุว่าเป็นวัตถุโดยมีฟิลด์ชื่อ "wrapper" ซึ่งเป็นชุดของนักเรียน ดังนั้นคำแนะนำของฉันจะเป็น

Wrapper = mapper.readValue(jsonStr , Wrapper.class);

โดยWrapperนิยามว่าเป็น

class Wrapper {
    List<Student> wrapper;
}

5

Firebase Android ใหม่เปิดตัวการเปลี่ยนแปลงครั้งใหญ่; ด้านล่างสำเนาเอกสาร:

[ https://firebase.google.com/support/guides/firebase-android] :

อัพเดตอ็อบเจ็กต์โมเดล Java ของคุณ

เช่นเดียวกับ SDK 2.x ฐานข้อมูล Firebase อัตโนมัติจะแปลงวัตถุ Java ที่คุณส่งผ่านไปยังDatabaseReference.setValue()เข้าไป JSON และสามารถอ่าน JSON เข้าไปในวัตถุ Java DataSnapshot.getValue()ใช้

ใน SDK ใหม่เมื่ออ่าน JSON เป็นวัตถุ Java ที่มีDataSnapshot.getValue()คุณสมบัติที่ไม่รู้จักใน JSON @JsonIgnoreExtraProperties(ignoreUnknown=true)จะถูกละเลยในขณะนี้โดยเริ่มต้นเพื่อให้คุณไม่จำเป็นอีกต่อไป

หากต้องการยกเว้นฟิลด์ / getters เมื่อเขียนวัตถุ Java เพื่อ JSON, คำอธิบายประกอบเรียกว่าตอนนี้แทน@Exclude@JsonIgnore

BEFORE

@JsonIgnoreExtraProperties(ignoreUnknown=true)
public class ChatMessage {
   public String name;
   public String message;
   @JsonIgnore
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)

AFTER

public class ChatMessage {
   public String name;
   public String message;
   @Exclude
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)

หากมีคุณสมบัติพิเศษใน JSON ของคุณที่ไม่ได้อยู่ในคลาส Java ของคุณคุณจะเห็นคำเตือนนี้ในไฟล์บันทึก:

W/ClassMapper: No setter/field for ignoreThisProperty found on class com.firebase.migrationguide.ChatMessage

คุณสามารถกำจัดคำเตือนนี้ได้โดยใส่@IgnoreExtraPropertiesคำอธิบายประกอบไว้ในชั้นเรียนของคุณ ถ้าคุณต้องการให้ฐานข้อมูล Firebase ทำงานเหมือนที่ทำใน 2.x SDK และโยนข้อยกเว้นหากมีคุณสมบัติที่ไม่รู้จักคุณสามารถใส่@ThrowOnExtraPropertiesคำอธิบายประกอบไว้ในชั้นเรียนของคุณ


4

สำหรับส่วนของฉันบรรทัดเดียว

@JsonIgnoreProperties(ignoreUnknown = true)

ไม่ได้ทำงานด้วย

เพียงเพิ่ม

@JsonInclude(Include.NON_EMPTY)

แจ็คสัน 2.4.0


4

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

4

ฉันแก้ไขปัญหานี้โดยเพียงแค่เปลี่ยนลายเซ็นของ setter และ getter method ของคลาส POJO ของฉัน สิ่งที่ฉันต้องทำคือเปลี่ยนวิธีการgetObjectเพื่อให้ตรงกับสิ่งที่ mapper กำลังมองหา ในกรณีของฉันฉันมีgetImageUrlเดิม แต่ข้อมูล JSON มีimage_urlซึ่งทำให้ mapper หยุดทำงาน ฉันเปลี่ยนทั้ง setter และ getters เป็นgetImage_url และ setImage_urlsetImage_url

หวังว่านี่จะช่วยได้


เห็นได้ชัดว่าคุณถูกต้อง: หากชื่อที่คุณต้องการคือ xxx_yyy วิธีที่จะเรียกมันว่าจะเป็น getXxx_yyy และ setXxx_yyy มันแปลกมาก แต่ก็ใช้งานได้
sivi

3

POJO ควรกำหนดเป็น

คลาสการตอบกลับ

public class Response {
    private List<Wrapper> wrappers;
    // getter and setter
}

คลาส Wrapper

public class Wrapper {
    private String id;
    private String name;
    // getters and setters
}

และ mapper เพื่ออ่านค่า

Response response = mapper.readValue(jsonStr , Response.class);

เกือบจะ ไม่ได้แต่wrappers wrapper
ฟราน

@Frans Haha ขอบคุณที่ติดตามข้อผิดพลาด ฉันใช้พหูพจน์ในการสะสม แต่สำหรับคำถามของ OP มันควรจะเป็นเอกพจน์
Dino Tw

3

นี่อาจเป็นการตอบสนองที่ช้ามาก แต่เพียงเปลี่ยน POJO เป็นสิ่งนี้ควรแก้ปัญหาสตริง json ที่ระบุไว้ในปัญหา (เนื่องจากสตริงอินพุตไม่อยู่ในการควบคุมของคุณตามที่คุณพูด):

public class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

3

ความเป็นไปได้อีกอย่างหนึ่งคือคุณสมบัตินี้ใน application.properties spring.jackson.deserialization.fail-on-unknown-properties=falseซึ่งไม่ต้องการการเปลี่ยนแปลงรหัสอื่น ๆ ในแอปพลิเคชันของคุณ และเมื่อคุณเชื่อว่าสัญญามีความเสถียรคุณสามารถลบคุณสมบัตินี้หรือทำเครื่องหมายเป็นจริง


3

นี่อาจไม่ใช่ปัญหาเดียวกับที่ OP มี แต่ในกรณีที่มีคนมาที่นี่ด้วยความผิดพลาดแบบเดียวกันฉันก็จะช่วยให้พวกเขาแก้ปัญหาได้ ฉันได้รับข้อผิดพลาดเดียวกับ OP เมื่อฉันใช้ ObjectMapper จากการพึ่งพาที่แตกต่างกันเป็นคำอธิบายประกอบ JsonProperty

งานนี้:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonProperty;

ไม่ทำงาน, ไม่เป็นผล:

import org.codehaus.jackson.map.ObjectMapper; //org.codehaus.jackson:jackson-mapper-asl:1.8.8
import com.fasterxml.jackson.annotation.JsonProperty; //com.fasterxml.jackson.core:jackson-databind:2.2.3

ขอบคุณ! นำเข้า com.fasterxml.jackson.annotation.JsonProperty ทำงานแทนฉัน :-) อื่น ๆ แทน
phil

2

Google นำมาให้ฉันที่นี่และฉันรู้สึกประหลาดใจที่เห็นคำตอบ ... ทุกข้อเสนอแนะผ่านข้อผิดพลาด ( ซึ่งมักจะกลับ 4 เท่าในภายหลังในการพัฒนา ) แทนที่จะแก้มันจนกว่าสุภาพบุรุษคนนี้คืนค่าด้วยศรัทธาใน SO!

objectMapper.readValue(responseBody, TargetClass.class)

ใช้ในการแปลง json String เป็นวัตถุคลาสสิ่งที่ขาดหายไปคือTargetClassควรมีgetter / setters สาธารณะ เหมือนกันในตัวอย่างคำถามของ OP ด้วยเช่นกัน! :)

ผ่านlombokชั้นเรียนของคุณดังต่อไปนี้ควรใช้งานได้ !!

@Data
@Builder
public class TargetClass {
    private String a;
}

2

นำเข้า com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties


บางทีอาจจะเป็นคำอธิบายเพิ่มเติมหรือ doc จะดี
Benj

@JsonIgnoreProperties (เพิกเฉย = จริง) ทำงานได้ดีขอบคุณ
Guilherme
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.