Jackson을 사용하여 JSON에서 필드 이름을 변경하는 방법


169

잭슨을 사용하여 내 객체를 json으로 변환하고 있습니다. 객체에는 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 자동 완성 기능과 함께 이것을 사용하고 싶기 때문에 'id'는 json에서 'value'로 나타나고 'name'은 'label'로 나타납니다. 잭슨의 문서는 이에 대한 명확하지 않습니다와 나는 내가 필요하지 않습니다하지만 난 얻을 수없는 것처럼, 심지어 원격으로 보인다 모든 주석을 해봤 name로 표시 label하고 id로 표시 valuejson으로한다.

이 작업을 수행하는 방법 또는 가능한지 아는 사람이 있습니까?


다른 목적이나 비즈니스 로직에 엔티티 ( "도시")를 잠재적으로 사용하려는 경우 JSON 표현을 레이블 및 값으로 정의하지 마십시오. OTOH 이것이 순전히 콤보에 사용되는 참조 데이터라면, 더 많이 가질 것입니다.이 모든 것을 포괄하는 일반 엔티티 (쌍 또는 옵션)를 만드는 것이 고려할 수있는 접근법입니다.
Thomas 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

비슷한 요구 사항이 있습니다. RESTEasy와 함께 Jackson을 사용하고 있는데 작동하지 않습니다 :-/ Strange!
Niks

Jackson이 실제로 다른 제공자가 아닌 구성된 제공자인지 확인하십시오.
henrik_lundgren

2
Jackson (또는 GSON)을 활용하여 기존 JSON 문자열에서 속성 이름을 변경하는 방법이 있습니까 (직렬화 중에는 아님)?
Don Cheadle

@JsonProperty ( "object") val jsonObject : String, ... 실패했습니다.
Raju yourPepe

45

이 있음을주의 org.codehaus.jackson.annotate.JsonProperty잭슨 1.x에서와 com.fasterxml.jackson.annotation.JsonProperty잭슨 2.x 또는 3.0에 사용중인 ObjectMapper (버전에 상관없이)를 확인하고 올바른 주석을 사용해야합니다.


도있다 org.json4s.jackson네임 스페이스. :) 및 가능하면 jacksonYMMV의 다른 구현입니다 .
Jesse Chisholm

14

필드 이름을 바꾸는 옵션이 하나 더 있습니다.

잭슨 믹스 인 .

주석을 달 수없는 타사 클래스 를 처리 하거나 Jackson 특정 주석으로 클래스를 오염시키지 않으려는 경우에 유용합니다 .

Mixins에 대한 Jackson 문서는 구식이므로이 는 더 명확합니다. 본질적으로 : 원하는 방식으로 직렬화를 수행하는 mixin 클래스를 만듭니다. 그런 다음 ObjectMapper에 등록하십시오.

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

필드를 직렬화 / 직렬화 해제 할 때 이것이 성능에 영향을 미치는지 궁금합니다.
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를 사용하는 경우 @JsonbProperty주석을 통해 JSON 특성 이름을 대체 할 수 있습니다 .

@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.