2017-11-02 13 views
1

다음 json 입력이 있습니다. 그리고 저는 Gson을 사용하여 구문 분석하고 있음을 알고 있습니다.Gson이 어떤 디시리얼라이저를 사용할 것인지 알고있는 방법

{ 
    “type”: “type1”, 
    “date”: “Tue, 16 May 2017 07:09:33 +0000”, 
    “body”: 
    { 
    “formatA_1”: “aaa”, 
    “formatA_2”: “bbbcccddd” 
    } 
    "other": "info" 
} 

public class Data { 

    private String type; 

    private Long date; 

    private Body body; 

    private String other; 
    ... 
} 

저는 날짜를 길게 변환하려고하므로 사용자 정의 DateDeserializer를 구현합니다.

public class DateDeserializer implements JsonDeserializer<Long> { 
    @Override 
    public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     return DateConvertUtils.convertStringDatetoLong(json.getAsString(), DateConvertUtils.SERVER_DATE_FORMAT); 
    } 
} 

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(Long.class, new DateDeserializer()); 
Gson gson = gsonBuilder.create(); 
Data data = gson.fromJson(json, Data.class); 

하지만 Gon이 DateDeserializer를 사용해야하는 "날짜"요소 만 알았는지 궁금합니다. 다른 요소가 DateDeserializer를 사용할 필요가 없다는 것을 어떻게 알 수 있습니까?

다른 맞춤형 디시리얼라이저를 추가하면 어떤 요소가 어떤 디시리얼라이저를 사용해야하는지 어떻게 알 수 있습니까?

고마워요.

+0

다른 String을 private으로 변경해보십시오. long other – Mars

+0

@Mars, 모든 유형 Long에 대해 구문 분석을 위해 DateDeserializer()를 사용합니다. 이 방법을 사용하면 복잡하고 다른 데이터 유형을 사용할 때 약간의 함정을 가질 수 있습니다. 내 코드에서 눈치 채지 않고 Date 구문 분석 예외, 다음 0 반환하십시오. 그래서 내 다른 긴 형식을 0이됩니다. 유일한 방법은 예외 경우 원래 값을 반환하는 것입니다? 이것을하는 방법입니까? –

+0

잠시 후, 아래 답변 해 드리겠습니다. – Mars

답변

0

Gson은 주어진 유형에 마지막으로 추가 된 디시리얼라이저를 사용하고 모든 경우에 대해 디시리얼라이저를 사용합니다. 귀하의 경우, 그것은 모든 및 모든 Longs에 대한 디시리얼라이저를 사용합니다.

+0

당신의 도움과 설명에 대해 감사드립니다. 그래서 다른 deserializer 클래스로 파싱하려면 2 개 이상의 동일한 유형의 사례를 피해야합니다. 알았다. 고마워요 :) –

+0

네, 아마도 Long이라는 DateLong에 대한 별도의 홀더 클래스를 Long 속성 "value"와 함께 만든 다음 deserializer가 구문 분석 한 "value"로 새 DateLong을 반환하게하십시오. – Mars