2016-07-17 3 views
1

그래서 서버의 응답을 구문 분석하고 싶습니다. 목표는 응답을 수신하고이를 직렬화하는 것보다 객체를 구축 할 통합 시스템을 구축하는 것입니다. 두 개 이상의 키 값 항목 객체들의 배열되는 상품;json objcts의 직렬화 및 비 직렬화

타입 1 :

서버로부터 응답의 4 개 가지 유형

{ 
    "response": { 
    "count": 1, 
    "items": [ 
     { 
     "id": 456239048, 
     "key1": "value_1", 
     "key2": "value_2" 
     } 
    ] 
    } 
} 

2 형 : 항목은 또한 예를 들어 도시로 불리는 또 다른 내부 객체를 가질 수 있습니다;

{ 
    "response": { 
    "count": 923, 
    "items": [ 
     { 
     "id": 1, 
     "first_name": "Test", 
     "last_name": "Test", 
     "city": { 
      "id": 2, 
      "title": "city1" 
     } 
     }, 
     { 
     "id": 2, 
     "first_name": "Test2", 
     "last_name": "Test2" 
     } 
    ] 
    } 
} 
응답의 마지막 마지막 두 가지 유형

:

{ 
    "error": { 
    "error_code": 14 
    } 
} 

{ 
    "response": [ 
    { 
     "id": 1 
    } 
    ] 
} 

그리고 두 번째는 그들은 등등 서버의 조건의 반응이다.

그래서 목표를 달성하기 위해 여러 클래스를 구현했습니다. 그리고 더 많은 시간 : - 직렬화와 역 직렬화 (json1 => object => json2; json1 = json2); - 개체 메서드 및 값에 대한 액세스.

public class DataModelDeserializer<T> implements JsonDeserializer<T> { 

     @Override 
     public T deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { 
      JsonElement items=null; 

      try{ 
       items = jsonElement.getAsJsonObject(); 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 

      return new Gson().fromJson(items, type); 
     } 
    } 

DataModel.java

public class DataModel { 
    private Response response; 


    public Response getResponse() { 
     return response; 
    } 

    public void setResponse(Response response) { 
     this.response = response; 
    } 


} 

Response.java

public class Response<T> { 
    private int count; 
    private List<T> items=new ArrayList<T>(); 
    public int getCount() { 
     return count; 
    } 

    public void setCount(int count) { 
     this.count = count; 
    } 

    public List<T> getItems() { 
     return items; 
    } 

    public void setItems(List<T> items) { 
     this.items = items; 
    } 
} 

Items.java

public class Items { 
     private int id; 
     public int getId() { 
      return id; 
     } 

     public void setId(int id) { 
      this.id = id; 
     } 
    } 

그리고 좋은 소식으로 시작 -이 방법은 달성하기 위해 나에게 도움이 첫 번째 목표 - covert json to ob ject and back. Hovewer Items 객체의 값에 액세스 할 수 없습니다. 오류가 발생합니다 :

Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to com.app.Items

그래, 난이 응답의 유형을 확인하는 방법에 문제에 직면하기 때문에이 방법은 정말 좋은 아니라고 생각합니다.

감사합니다.

답변

1

응답 형식을 표준 응답 형식으로 변경하십시오. 앞서 그것이 success 필드의 값을 기준으로 응답 어떤 종류의 시간을 알고 동안

{ 
    "success":"true", 
    "responseData": { 
     // your data here 
    }, 
    "errorMessage": "only set if success == false", 
    "errorData": { 
     // any error data here 
    } 
} 

그럼 당신은 응답 모든 종류의 같은 구문 분석 로직을 사용할 수 있습니다.

+0

문제는 응답 형식을 편집 할 수 없다는 것입니다. 내가 가지고있는 유일한 아이디어는 type이라는 json 속성에 추가하여 작업하는 것입니다.하지만 그저 조용한 해킹입니다 ... – Ascelhem

+0

어떻게 응답 형식을 편집 할 수 있지만 여전히 json 속성을 추가 할 수 있습니까? –