GSON을 사용하여 JSON 스타일 속성 이름을 Java CamelCase 이름으로 변환


106

GSON 을 사용하여 JSON 데이터를 Java 개체로 변환하고 있습니다. 내 모든 테스트에서 꽤 잘 작동합니다. 문제는 실제 객체가 is_online과 같은 이름의 일부 속성을 가지고 있다는 것입니다. GSON은 이름이 완전히 동일한 경우에만 매핑합니다. GSON이 이름을 Java camel case isOnline으로 변환하도록하는 것이 좋습니다.

JSON 데이터를 생성하는 동안 이것이 가능한 것 같습니다. camel case는 JSON에서 밑줄로 구분 된 단어로 변환됩니다. 그러나 이것을 다른 방법으로 지정하는 방법을 찾을 수 없습니다.


5
나는 대답을 받아 들일 것을 제안 것
장 발장

답변:


313

밑줄이있는 속성이있는 json을 읽고 모델에서 카멜 케이스를 사용할 때 다음 설정이 완벽하게 작동 함을 발견했습니다.

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

2
좋은 대답, 감사합니다! @janusz,이 답변 중 도움이 되었으면 수락 된 답변으로 표시해주세요.
sufinawaz

1
이름에 두 개의 밑줄이 포함 된 경우 첫 번째 밑줄을 무시합니다. 전의. this_key_has__two_underscores는 thisKeyHas_TwoUnderscores로 변환되고 그 반대의 경우도 마찬가지입니다. 핵심은 FieldNamingPolicy입니다. 여기서 열거 형에는 밑줄이있는 "소문자"라고 표시되고 여기에서 변환 된 이름에는 밑줄 (_T)이있는 대문자가 있습니다.
Deepak GM은

매우 간단하여 여러 필드에 주석을 달지 않아도됩니다.
William T. Mallard

98

SerializedName주석을 사용할 수 있습니다 .

@SerializedName("field_name_in_json")
private final String fieldNameInJava;

참고 : FieldNamingPolicy이미를 SerializedName설정 한 경우는 해당 특정 필드에 대한 설정을 덮어 씁니다 (특수한 경우에 매우 편리함).


2

귀하의 예가 엣지 케이스임을 명심하십시오. 속성이 'foo'인 경우 getter의 이름은 'getFoo'이고 'foo_bar'라는 속성이있는 경우 getter의 이름은 'getFooBar'여야하지만 예제에서는 부울을 매핑하고 부울에는 자바의 특별한 경우 명명 규칙. online이라는 기본 부울 속성에는 'getOnline'이 아닌 'isOnline'이라는 getter가 있어야하며, 더 나쁜 경우에는 'getIsOnline'이 있어야합니다. 부울 래퍼 객체 (예 : 부울)는이 특수한 경우를 따르지 않아야하며 'online'이라는 속성에는 'getOnline'이라는 getter가 있어야합니다.

따라서 이름에 'is'가 포함 된 부울 속성을 갖는 것은 변환하는 동안이 특정 접두사를 제거해야하는 경우가 많습니다. 반대로 코드는 원시 속성 이름과 'is_XXX'버전 모두에 대해 json 개체를 검사 할 수 있습니다.


2

네가 원하는 게 여기있는 것 같아 . 주석을 사용하면 GSON에게 mySuperCoolField가 실제로 JSON에서 this_field_is_fun이라고하며 올바르게 압축이 풀린다 고 알릴 수 있습니다. 적어도 역 직렬화에도 작동한다고 생각합니다.

그래도 작동하지 않으면 잘 작동하는 사용자 지정 JsonSerializer / JsonDeserializers를 사용할 수 있지만 클래스의 변경 사항 (예 : 필드 추가)에 맞게 업데이트해야합니다. 당신은 자동 마법을 잃습니다.

가장 쉬운 방법은 (추악하지만 첫 번째 제안이 작동하지 않으면 매우 깨끗하고 간단합니다) GSON을 행복하게 만드는 방식으로 필드에 이름을 지정하고 원하는 이름으로 추가 접근 자 메서드를 추가하는 것입니다. , 예 :

public boolean isXXX() {return this.is_XXX;}

쉬운 일은 제가 지금하고있는 일이고 잘 작동합니다. 모든 추악한 일반적인 자바 스타일 코드는 데이터 클래스에 숨겨져 있으며 외부에서 아무도 볼 수 없습니다. 그러나 그것은 여전히 ​​조금 잔소리입니다 :)
Janusz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.