Cách thay đổi tên trường trong JSON bằng Jackson


169

Tôi đang sử dụng jackson để chuyển đổi một đối tượng của tôi thành json. Đối tượng có 2 trường:

@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; }
}

Vì tôi muốn sử dụng tính năng này với tính năng hoàn thành tự động của jQuery, tôi muốn 'id' xuất hiện dưới dạng 'value' trong json và 'name' xuất hiện dưới dạng 'nhãn'. Tài liệu về jackson không rõ ràng về điều này và tôi đã thử mọi chú thích rằng thậm chí từ xa có vẻ như nó làm những gì tôi cần nhưng tôi không thể namexuất hiện labelidxuất hiện như valuetrong json.

Có ai biết làm thế nào để làm điều này hoặc nếu điều này là có thể?


nếu Nếu bạn đã từng có khả năng sử dụng thực thể ("Thành phố") cho bất kỳ mục đích hoặc logic kinh doanh nào khác, tôi sẽ tránh xác định biểu diễn JSON của nó là Nhãn & Giá trị. OTOH nếu đây hoàn toàn là dữ liệu tham chiếu được sử dụng cho các combo, bạn có thể sẽ có nhiều hơn - tạo một thực thể chung (Cặp hoặc Tùy chọn) để bao quát tất cả những điều này là một cách tiếp cận có thể xem xét.
Thomas W

Câu trả lời:


323

Bạn đã thử sử dụng @JsonProperty chưa?

@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
Vâng, tôi đã thử điều đó, tuy nhiên tôi đang làm @JsonProperty(value="label")và nó không hoạt động, tôi đã thử nó như bạn đã đề xuất và nó hoạt động! cảm ơn người đàn ông này sẽ thực sự giúp đơn giản hóa mã bây giờ.
Ali

Tôi có một yêu cầu tương tự. Chỉ là tôi đang sử dụng Jackson với REST EAS và điều này không hoạt động: - / Lạ thật!
Niks

xác minh rằng Jackson thực sự là nhà cung cấp được cấu hình chứ không phải cái gì khác
henrik_lundgren

2
có cách nào để tận dụng Jackson (hoặc GSON) để thay đổi tên thuộc tính trong chuỗi JSON đã tồn tại (không phải trong quá trình tuần tự hóa) không?
Don Cheadle

Tôi đã sử dụng đối tượng @JsonProperty ( "đối tượng") val JSONObject: String, ... nhưng thất bại
Raju yourPepe

45

Xin lưu ý rằng có org.codehaus.jackson.annotate.JsonPropertyở Jackson 1.x và com.fasterxml.jackson.annotation.JsonPropertyJackson 2.x. Kiểm tra ObjectMapper nào bạn đang sử dụng (từ phiên bản nào) và đảm bảo bạn sử dụng chú thích phù hợp.


Ngoài ra còn có một org.json4s.jacksonkhông gian tên. :) và có thể thực hiện jacksonYMMV khác.
Jesse Chisholm

14

Có một tùy chọn khác để đổi tên trường:

Jackson MixIns .

Hữu ích nếu bạn đối phó với các lớp bên thứ ba mà bạn không thể chú thích hoặc bạn không muốn làm ô nhiễm lớp với các chú thích cụ thể của Jackson.

Tài liệu Jackson cho Mixins đã lỗi thời, vì vậy ví dụ này có thể cung cấp rõ ràng hơn. Về bản chất: bạn tạo lớp mixin thực hiện tuần tự hóa theo cách bạn muốn. Sau đó đăng ký nó vào ObjectMapper:

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

Tôi tò mò điều này sẽ ảnh hưởng đến hiệu suất khi các trường tuần tự hóa / giải tuần tự hóa?
chanllen

2

Jackson

Nếu bạn đang sử dụng Jackson, thì bạn có thể sử dụng @JsonPropertychú thích để tùy chỉnh tên của một thuộc tính JSON đã cho.

Do đó, bạn chỉ cần chú thích các trường thực thể với @JsonPropertychú thích và cung cấp tên thuộc tính JSON tùy chỉnh, như sau:

@Entity
public class City {

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

   @JsonProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}

JavaEE hoặc JakartaEE JSON-B

JSON-B là lớp liên kết chuẩn để chuyển đổi các đối tượng Java sang và từ JSON. Nếu bạn đang sử dụng JSON-B, thì bạn có thể ghi đè tên thuộc tính JSON thông qua @JsonbPropertychú thích:

@Entity
public class City {

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

   @JsonbProperty("label")
   private String name;

   //Getters and setters omitted for brevity
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.