GSON을 사용하여 JSON 스타일 속성 이름을 Java CamelCase 이름으로 변환
GSON 을 사용하여 JSON 데이터를 Java 개체로 변환하고 있습니다. 내 모든 테스트에서 꽤 잘 작동합니다. 문제는 실제 객체가 is_online과 같은 이름의 일부 속성을 가지고 있다는 것입니다. GSON은 이름이 완전히 동일한 경우에만 매핑합니다. GSON이 이름을 Java camel case isOnline으로 변환하도록하는 것이 좋습니다.
JSON 데이터를 생성하는 동안 이것이 가능한 것 같습니다. camel case는 JSON에서 밑줄로 구분 된 단어로 변환됩니다. 그러나 이것을 다른 방법으로 지정하는 방법을 찾을 수 없습니다.
밑줄이있는 속성이있는 json을 읽고 모델에서 카멜 케이스를 사용할 때 다음 설정이 완벽하게 작동 함을 발견했습니다.
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
SerializedName
주석을 사용할 수 있습니다 .
@SerializedName("field_name_in_json")
private final String fieldNameInJava;
참고 : FieldNamingPolicy
이미를 SerializedName
설정 한 경우는 해당 특정 필드에 대한 설정을 덮어 씁니다 (특수한 경우에 매우 편리함).
귀하의 예가 엣지 케이스임을 명심하십시오. 속성이 'foo'인 경우 getter의 이름은 'getFoo'이고 'foo_bar'라는 속성이있는 경우 getter의 이름은 'getFooBar'여야하지만 예제에서는 부울을 매핑하고 부울에는 자바의 특별한 경우 명명 규칙. online이라는 기본 부울 속성에는 'getOnline'이 아닌 'isOnline'이라는 getter가 있어야하며, 더 나쁜 경우에는 'getIsOnline'이 있어야합니다. 부울 래퍼 객체 (예 : 부울)는이 특수한 경우를 따르지 않아야하며 'online'이라는 속성에는 'getOnline'이라는 getter가 있어야합니다.
따라서 이름에 'is'가 포함 된 부울 속성을 갖는 것은 변환하는 동안이 특정 접두사를 제거해야하는 경우가 많습니다. 반대로 코드는 원시 속성 이름과 'is_XXX'버전 모두에 대해 json 개체를 검사 할 수 있습니다.
나는 당신이 원하는 것이 여기에 있다고 생각 합니다 . 주석을 사용하면 GSON에게 mySuperCoolField가 실제로 JSON에서 this_field_is_fun이라고하며 올바르게 압축이 풀린다 고 알릴 수 있습니다. 적어도 역 직렬화에도 작동한다고 생각합니다.
그래도 작동하지 않으면 잘 작동하는 사용자 지정 JsonSerializer / JsonDeserializers를 사용할 수 있지만 클래스의 변경 사항 (예 : 필드 추가)에 맞게 업데이트해야합니다. 당신은 자동 마법을 잃습니다.
가장 쉬운 방법은 (추악하지만 첫 번째 제안이 작동하지 않으면 매우 깨끗하고 간단합니다) GSON을 행복하게 만드는 방식으로 필드에 이름을 지정하고 원하는 이름으로 추가 접근 자 메서드를 추가하는 것입니다. , 예 :
public boolean isXXX() {return this.is_XXX;}
'Programing' 카테고리의 다른 글
RecyclerView.State를 사용하여 RecyclerView의 스크롤 위치를 저장하는 방법은 무엇입니까? (0) | 2020.08.27 |
---|---|
gcc가 C에서 일부 명령문을 최적화하는 것을 방지하는 방법은 무엇입니까? (0) | 2020.08.27 |
아래 디렉토리를 파지 않고 os.walk (0) | 2020.08.27 |
NSString에서 문자를 제거 하시겠습니까? (0) | 2020.08.27 |
sqlite 쿼리에서 dict를 어떻게 얻을 수 있습니까? (0) | 2020.08.26 |