제 3 강
17662 단어 Gson
이번 주요 내용:
필드 필터 의 몇 가지 방법
@Expose
주해 기반 버 전 기반 접근 수정자 기반 정책 기반 (작성 자가 가장 많이 사용) POJO 와 JSON 의 필드 맵 규칙 1. 필드 필터 의 몇 가지 방법
필드 필터 Gson 에서 자주 사용 되 는 기술 입 니 다. 특히 Android 에 서 는 비 즈 니스 논 리 를 처리 할 때 설 정 된 POJO 에 필드 를 추가 해 야 할 수도 있 지만 직렬 화 과정 에서 필요 하지 않 습 니 다. 그리고 직렬 화 를 하면 문 제 를 가 져 올 수 있 습 니 다. 반복 참조 ,그렇다면 Gson 으로 서열 화 되 기 전에 이런 사건 이 발생 하지 않도록 다른 처 리 를 해 야 한다.
하나의 상품 으로 분류
Category
예 를 들다.{
"id": 1,
"name": " ",
"children": [
{
"id": 100,
"name": " "
},
{
"id": 101,
"name": " "
}
]
}
하나의 큰 분 류 는 많은 작은 분류 가 있 을 수 있다. 그러면 우리 가 디자인
Category
류 를 디자인 할 때 Category
자체 가 큰 분류 일 수도 있 고 작은 분류 일 수도 있다.public class Category {
public int id;
public String name;
public List children;
}
그러나 업 무 를 처리 하기 위해 서 는 하위 분류 에 부모 분 류 를 저장 해 야 하 며, 결국 아래 의 상황 이 될 것 이다.
public class Category {
public int id;
public String name;
public List children;
// ,
public Category parent;
}
그러나 위의
parent
필드 는 업무 수요 가 증가 하기 때문에 직렬 화 는 필요 하지 않 기 때문에 직렬 화 할 때 반드시 배제 해 야 한다. 그러면 Gson
에서 조건 에 맞 는 필드 를 어떻게 배제 합 니까?다음은 네 가지 방법 을 제공 합 니 다. 여러분 은 필요 에 따라 스스로 적당 한 방식 을 선택 할 수 있 습 니 다.@ Expose 주석 기반
@ Expose 는 두 개의 속성 을 제공 하고 기본 값 이 있 으 며 개발 자 는 필요 에 따라 다른 값 을 설정 할 수 있 습 니 다.
@Expose
@Expose 주 해 는 이름 에서 노출 의 뜻 을 알 수 있 기 때문에 이 주 해 는 장소 노출 필드 에 사용 된다.근 데 저희 가 예전 에 Gson 을 쓸 때 도 @ Expose 가 없 었 어 요. 주해 가 정확 하지 않 은 서열 이 JSON 으로 바 뀌 었 나 요?네, 그래서 이 주 해 는 사용 하고 있 습 니 다
new Gson()
시 는 작용 하지 않 는 다.가장 많이 사용 되 는 API 가 가장 간단 해 야 하기 때문에 이 주 해 는 GsonBuilder
와 함께 사용 해 야 합 니 다.사용 방법: 쉽게 말 하면 내 보 내야 할 필드 에 @ Expose 를 추가 하 는 것 입 니 다. 주석, 내 보 내지 않 는 필드 는 추가 하지 않 습 니 다.주 의 는 내 보 내지 않 고 추가 하지 않 습 니 다.
@Expose //
@Expose(deserialize = true,serialize = true) //
@Expose(deserialize = true,serialize = false) //
@Expose(deserialize = false,serialize = true) //
@Expose(deserialize = false,serialize = false) //
주: 위의 그림 에 따 르 면 모든 값
true
의 속성 은 쓰 지 않 아 도 됩 니 다.위의 예 를 들 면
public class Category {
@Expose public int id;
@Expose public String name;
@Expose public List children;
// , @Expose ,
// @Expose(deserialize = false,serialize = false)
public Category parent;
}
Gson 을 사용 할 때 도 단순 한 것 만 은 아니다
new Gson()
.Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
gson.toJson(category);
버 전 기반
Gson 은 버 전 기반 필드 내 보 내기 에 두 개의 주 해 를 제공 합 니 다.
@Since
화해시키다 @Until
, GsonBuilder.setVersion(Double)
와 함께 사용 합 니 다.@Since
화해시키다 @Until
모두 하나의 Double
값 을 받는다.Since 와 Until 주해
사용 방법: 현재 버 전 (GsonBuilder 에서 설정 한 버 전) since 와 같은 값 보다 클 때 이 필드 를 내 보 냅 니 다. Until 보다 작 을 때 이 필드 를 내 보 냅 니 다.
class SinceUntilSample {
@Since(4)
public String since;
@Until(5)
public String until;
}
public void sineUtilTest(double version){
SinceUntilSample sinceUntilSample = new SinceUntilSample();
sinceUntilSample.since = "since";
sinceUntilSample.until = "until";
Gson gson = new GsonBuilder().setVersion(version).create();
System.out.println(gson.toJson(sinceUntilSample));
}
// version <4 , :{"until":"until"}
// version >=4 && version <5 , :{"since":"since","until":"until"}
// version >=5 , :{"since":"since"}
주: 한 필드 가 동시에 주 해 될 때 두 가지 조건 을 동시에 만족 시 켜 야 합 니 다.
접근 수정자 기반
장식 부적 이란 무엇 입 니까?
public
、 static
、 final
、 private
、 protected
이것들 이 바로, 그래서 이런 방식 도 비교적 특수 하 다.사용 방법:class ModifierSample {
final String finalField = "final";
static String staticField = "static";
public String publicField = "public";
protected String protectedField = "protected";
String defaultField = "default";
private String privateField = "private";
}
GsonBuilder.excludeFieldsWithModifiers
를 사용 하여 gson 을 구축 하고 지원 int
형의 가 변 파 라미 터 를 지원 합 니 다. 값 은 java.lang.reflect.Modifier
제공 되 며 아래 프로그램 은 제 외 됩 니 다 privateField
、 finalField
와 staticField
세 필드.ModifierSample modifierSample = new ModifierSample();
Gson gson = new GsonBuilder()
.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PRIVATE)
.create();
System.out.println(gson.toJson(modifierSample));
// :{"publicField":"public","protectedField":"protected","defaultField":"default"}
지금까지 Gson 이 제공 한 모든 주 해 는 하나 더
@JsonAdapter
소개 되 지 않 았 고 @JsonAdapter
와 TypeAdapter
는 이 시리즈 4 편 이자 마지막 글 의 주요 내용 이 될 것 이다.정책 기반 (사용자 정의 규칙)
위 에서 소개 한 세 가지 필드 를 제외 하 는 방법 입 니 다. 솔직히 저 는 @ Expose 를 제외 하고 모두 Demo 에서 만 사용 한 적 이 있 습 니 다. 가장 많이 사용 하 는 것 은 바로 소개 해 야 할 사용자 정의 규칙 입 니 다. 장점 은 기능 이 강하 고 유연성 이 있 습 니 다. 단점 은 다른 세 가지 방법 에 비해 조금 번 거 롭 지만 다른 세 가지 에 대해 조금 번 거 롭 고 싶 을 뿐 입 니 다.
정책 기반 은 Gson 이 제공 하 는
ExclusionStrategy
인 터 페 이 스 를 이용 하여 똑 같이 사용 해 야 한다 GsonBuilder
. 관련 API 2 개 는 각각 addSerializationExclusionStrategy
이다. 와 addDeserializationExclusionStrategy
각각 서열 화 와 반 서열 화 를 겨냥 할 때.여기 서 서열 화 를 예 로 들 자.예 를 들 면:
Gson gson = new GsonBuilder()
.addSerializationExclusionStrategy(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
// , ,return true
if ("finalField".equals(f.getName())) return true; //
Expose expose = f.getAnnotation(Expose.class);
if (expose != null && expose.deserialize() == false) return true; //
return false;
}
@Override
public boolean shouldSkipClass(Class> clazz) {
// ,return true
return (clazz == int.class || clazz == Integer.class);
}
})
.create();
강하 지 않 나 요?
2. POJO 와 JSON 의 필드 맵 규칙
그 전에 진짜 Gson 쓸 줄 알 아 요?Gson 사용 안내 (2) 속성 이름 을 바 꿀 때
@SerializedName
이 주해 의 사용 을 소 개 했 습 니 다. 이 절의 내용 은 지난번 과 차이 가 많 지 않 지만 맵 규칙 이 라 고 부 르 는 이상 자 연 스 럽 게 규칙 적 인 상황 입 니 다.아니면 이전 User 의 예 로 모든 주 해 를 제 거 했 습 니까?User user = new User(" kidou", 24);
user.emailAddress = "[email protected]";
GsonBuilder
인터페이스 와 FieldNamingStrategy
, setFieldNamingPolicy
두 가지 방법 을 제공 했다.기본 구현
setFieldNamingStrategy
방법 은 Gson 이 제공 하 는 또 다른 매 거 진 클래스 GsonBuilder.setFieldNamingPolicy
와 결합 하여 사용 하 는데 이 매 거 진 클래스 는 5 가지 실현 방식 을 제공 합 니 다.FieldNamingPolicy 결과 (emailAddress 필드 만 출력)
IDENTITY
{"emailAddress":"[email protected]"}
LOWER_CASE_WITH_DASHES
{"email-address":"[email protected]"}
LOWER_CASE_WITH_UNDERSCORES
{"email_address":"[email protected]"}
UPPER_CAMEL_CASE
{"EmailAddress":"[email protected]"}
UPPER_CAMEL_CASE_WITH_SPACES
{"Email Address":"[email protected]"}
사용자 정의 구현
FieldNamingPolicy
방법 은 Gson 이 제공 하 는 GsonBuilder.setFieldNamingStrategy
인터페이스 와 결합 하여 사용 해 야 하 며, POJO 의 필드 를 JSON 의 필드 와 대응 하 는 데 사용 해 야 한다.위의 FieldNamingStrategy
도 실제로 FieldNamingPolicy
인 터 페 이 스 를 실현 했다. 즉 FieldNamingStrategy
도 FieldNamingPolicy
방법 을 사용 할 수 있다 는 것 이다.사용법:
Gson gson = new GsonBuilder()
.setFieldNamingStrategy(new FieldNamingStrategy() {
@Override
public String translateName(Field f) {
//
return null;
}
})
.create();
주의:
setFieldNamingStrategy
주 해 는 최고 우선 순 위 를 가지 고 있 으 며, @SerializedName
주 해 를 추가 한 필드 @SerializedName
에 서 는 유효 하지 않 습 니 다!원본 링크:http://www.jianshu.com/p/0e40a52c0063
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
제 3 강특히 Android 에 서 는 비 즈 니스 논 리 를 처리 할 때 설 정 된 POJO 에 필드 를 추가 해 야 할 수도 있 지만 직렬 화 과정 에서 필요 하지 않 습 니 다. 주해 가 정확 하지 않 은 서열 이 JS...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.