วิธีเปลี่ยนชื่อฟิลด์ใน JSON โดยใช้ Jackson


169

ฉันใช้แจ็คสันในการแปลงวัตถุของฉันเป็นเจสัน วัตถุมี 2 ฟิลด์:

@Entity
public class City {
   @id
   Long id;
   String name;
   public String getName() { return name; }
   public void setName(String name){ this.name = name; }
   public Long getId() { return id; }
   public void setName(Long id){ this.id = id; }
}

เนื่องจากฉันต้องการใช้คุณลักษณะนี้กับ jQuery auto complete ฉันต้องการให้ 'id' ปรากฏเป็น 'value' ใน json และ 'name' เพื่อให้ปรากฏเป็น 'label' เอกสารของแจ็คสันไม่ชัดเจนเกี่ยวกับเรื่องนี้และฉันได้ลองทุกคำอธิบายประกอบที่แม้จากระยะไกลดูเหมือนว่ามันเป็นสิ่งที่ฉันต้องการ แต่ฉันไม่สามารถnameปรากฏlabelและidปรากฏvalueใน json

ไม่มีใครรู้วิธีการทำเช่นนี้หรือถ้าเป็นไปได้?


หากคุณเคยใช้เอนทิตี ("เมือง") เพื่อวัตถุประสงค์อื่นหรือตรรกะทางธุรกิจใด ๆ ฉันจะหลีกเลี่ยงการกำหนดการแสดง JSON เป็นเลเบลและค่า OTOH ถ้านี่เป็นข้อมูลอ้างอิงล้วนๆที่ใช้สำหรับคอมโบคุณน่าจะมีมากกว่า - สร้างเอนทิตี้ทั่วไป (Pair หรือ Option) เพื่อครอบคลุมสิ่งเหล่านี้ทั้งหมดเป็นแนวทางที่เป็นไปได้ในการพิจารณา
โทมัส W

คำตอบ:


323

คุณลองใช้ @JsonProperty แล้วหรือยัง?

@Entity
public class City {
   @id
   Long id;
   String name;

   @JsonProperty("label")
   public String getName() { return name; }

   public void setName(String name){ this.name = name; }

   @JsonProperty("value")
   public Long getId() { return id; }

   public void setId(Long id){ this.id = id; }
}

5
ใช่ฉันได้ลองแล้ว แต่ฉันกำลังทำอยู่@JsonProperty(value="label")และมันไม่ทำงานฉันได้ลองตามที่คุณแนะนำและใช้งานได้! ขอบคุณคนนี้จะช่วยให้รหัสง่ายขึ้นในขณะนี้
Ali

ฉันมีข้อกำหนดที่คล้ายกัน แค่ว่าฉันกำลังใช้ Jackson กับ RESTEasy และมันก็ใช้ไม่ได้: - / แปลก!
Niks

ยืนยันว่าแจ็กสันเป็นผู้ให้บริการที่ได้รับการกำหนดค่าจริงๆและไม่ใช่อย่างอื่น
henrik_lundgren

2
มีวิธีใดที่ใช้ประโยชน์จาก Jackson (หรือ GSON) เพื่อเปลี่ยนชื่อคุณสมบัติในสตริง JSON ที่มีอยู่แล้ว (ไม่ใช่ระหว่างการทำให้เป็นอนุกรม)
Don Cheadle

ฉันใช้ object @JsonProperty ("object") val jsonObject: String, ... แต่ล้มเหลว
Raju yourPepe

45

ระวังว่ามีorg.codehaus.jackson.annotate.JsonPropertyใน Jackson 1.x และcom.fasterxml.jackson.annotation.JsonPropertyJackson 2.x ตรวจสอบว่าคุณใช้ ObjectMapper ใด (จากเวอร์ชันใด) และตรวจสอบให้แน่ใจว่าคุณใช้คำอธิบายประกอบที่เหมาะสม


นอกจากนี้ยังมีorg.json4s.jacksonเนมสเปซ :) และการใช้jacksonYMMV อื่น ๆ
Jesse Chisholm

14

มีอีกหนึ่งตัวเลือกในการเปลี่ยนชื่อฟิลด์:

แจ็คสัน mixins

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

เอกสารประกอบของ Jackson สำหรับ Mixins ล้าสมัยดังนั้นตัวอย่างนี้สามารถให้ความชัดเจนมากขึ้น ในสาระสำคัญ: คุณสร้างคลาส mixin ซึ่งจะทำให้เป็นอันดับในแบบที่คุณต้องการ จากนั้นลงทะเบียนกับ ObjectMapper:

objectMapper.addMixIn(ThirdParty.class, MyMixIn.class);

ฉันอยากรู้อยากเห็นสิ่งนี้จะส่งผลกระทบต่อประสิทธิภาพการทำงานเมื่อเป็นอันดับเขตข้อมูล / deserializing?
chanllen

2

แจ็คสัน

หากคุณกำลังใช้ Jackson คุณสามารถใช้@JsonPropertyคำอธิบายประกอบเพื่อกำหนดชื่อของคุณสมบัติ JSON ที่กำหนดเอง

ดังนั้นคุณเพียงแค่ใส่คำอธิบายประกอบในช่องเอนทิตีด้วย@JsonPropertyคำอธิบายประกอบและให้ชื่อคุณสมบัติ JSON ที่กำหนดเองเช่นนี้:

@Entity
public class City {

   @Id
   @JsonProperty("value")
   private Long id;

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE หรือ JakartaEE JSON-B

JSON-B เป็นเลเยอร์การเชื่อมโยงมาตรฐานสำหรับการแปลงวัตถุ Java เป็นและจาก JSON หากคุณกำลังใช้ JSON-B คุณสามารถแทนที่ชื่อคุณสมบัติ JSON ผ่าน@JsonbPropertyหมายเหตุประกอบ:

@Entity
public class City {

   @Id
   @JsonbProperty("value")
   private Long id;

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.