Gson 범용 패 키 징 해석 약정 형식 JSON 문자열

저자:@dusunboy 옮 겨 실 으 려 면 뚜렷 한 위치 에 작가 정보 와 원문 링크 를 보관 해 야 합 니 다.블 로그 에 부적 절 한 점 이 있 으 면 댓 글 교 류 를 환영 합 니 다.http://www.jianshu.com/p/1d3853ac0321 개인 블 로그:http://www.dusunboy.io
약속 형식 JSON 문자열
// data   object    
{"status":"1","message":"           ","data":{}}
// data   array    
{"status":"0","message":"           ","data":[]}

작업 중 에 이런 약정 형식 을 자주 만 날 수 있 습 니 다.어떻게 좋 은 패 키 징 을 쓰 면 data 가 대상 인지 배열 인지 자동 으로 식별 할 수 있 습 니까?
Gson 범 형 해석
gs on 은 일반적인 해석 을 지원 합 니 다.위의 형식 에서 대응 하 는 두 가지 방법 을 써 서 포장 할 생각 입 니 다.
//    data       
public static  BaseJsonBean fromJson2Object() {}
//    data       
public static  BaseJsonBean> fromJson2Array(){}

베이스 제 이 슨 빈
public class BaseJsonBean {

    private String status;
    private String message;
    private T data;
    private ArrayList dataList;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public ArrayList getDataList() {
        return dataList;
    }

    public void setDataList(ArrayList dataList) {
        this.dataList = dataList;
    }
}

문제.
이렇게 하면 문제 가 있 습 니 다.매번 에 우 리 는 이 data 가 대상 인지 배열 인지 미리 알 아야 해당 하 는 방법 을 선택 하여 코드 로 스스로 판단 할 수 있 습 니까?물론 가능 합 니 다.Gson 사용자 정의 반 직렬 화 를 사용 합 니 다.
Gson 사용자 정의 역 직렬 화
GsonBuilder 등록 형식 어댑터 registerTypeAdapter()를 사용 하여 역 직렬 화
public BaseJsonBean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        Gson gson = new Gson();
        BaseJsonBean baseJsonBean = new BaseJsonBean();
        JsonObject jsonObject = json.getAsJsonObject();
        JsonElement jsonDataElement = jsonObject.get("data");
        baseJsonBean.setStatus(jsonObject.get("status").getAsString());
        baseJsonBean.setMessage(jsonObject.get("message").getAsString());
        if (jsonDataElement.isJsonArray()) {
            baseJsonBean.setData(null);
            baseJsonBean.setDataList(fromJson2Array(gson, jsonDataElement, aClass));
        } else {
            baseJsonBean.setData(fromJson2Object(gson, jsonDataElement, aClass));
            baseJsonBean.setDataList(null);
        }
        return baseJsonBean;
    }

사용 예시
Gson gson = new GsonBuilder().registerTypeAdapter(BaseJsonBean.class,
                new BaseJsonBeanDeserializer<>(DemoBean.class)).create();
BaseJsonBean baseJsonBean = gson.fromJson(json,
                new TypeToken>() {}.getType());
//    
baseJsonBean.getData();
//    
baseJsonBean.getDataList();

마지막 으로 어떤 제 이 슨 데이터 형식 이 든 한 가지 로 해석 합 니 다.
원본 주소
프로젝트 에 사용 되 는 일반적인 생 성 라 이브 러 리 TypeBuilder
저 에 대한 건의 와 부족 함 을 환영 합 니 다.감사합니다.

좋은 웹페이지 즐겨찾기