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

잭슨을 사용하여 내 객체를 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으로한다.

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



답변

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


답변

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


답변

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

잭슨 믹스 인 .

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

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

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


답변

잭슨

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
}


답변