제 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"}

주: 한 필드 가 동시에 주 해 될 때 두 가지 조건 을 동시에 만족 시 켜 야 합 니 다.
접근 수정자 기반
장식 부적 이란 무엇 입 니까?  publicstatic  、 finalprivateprotected  이것들 이 바로, 그래서 이런 방식 도 비교적 특수 하 다.사용 방법:
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 소개 되 지 않 았 고 @JsonAdapterTypeAdapter 는 이 시리즈 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 인 터 페 이 스 를 실현 했다. 즉 FieldNamingStrategyFieldNamingPolicy 방법 을 사용 할 수 있다 는 것 이다.
사용법:
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

좋은 웹페이지 즐겨찾기