2013-10-21 2 views
0

모두Gson을 생성자로 확장하고 모든 유형의 기본 객체를 생성하려면 어떻게해야합니까?

Gson은 내게 많은 영감을줍니다. 이제 Gson을 확장하여 사용자 정의 기본값을 사용하여 다른 유형의 객체를 작성해야합니다. 나는 Gson의 어떤 부분을 다시 써야 하나? Gson을 재사용하고 기본 유형을 지원하고 싶습니다. 그러나 현재 Gson의 소스 코드를 검토 한 후 설계하기 위해 그 기반을 이루기가 어렵다는 것을 발견했습니다.

이제 내 요구 사항은 다음과 같이 나타낼 수

을 나는 그런 같은 POJO 클래스를 정의 :

TestInputParam.class :

public class TestInputParam{ 
    private Date startTime; 
    private String name; 
    private int num; 

    //setters and gettters 
} 

요구 사항 :

GsonEx<TestInputParam> gsonEx = new GsonEx<TestInputParam>(); 
TestInputParam defaultParam = gsonEx.build(TestInputParam.class) 

System.out.println(new Gson().toJson(defaultParam)); 

결과 :

It should output this object default value . 

주 :

나의 이해는 다음과 같습니다. 새로운 GSON() fromJson는 (stringContent은 타입) 그냥 수 확장, JsonReader에 의해 StringContent 값으로 해당 객체를 구축 디폴트 또는 임의의 값에 의해 대응하는 객체를 구축한다. stringContent에서 해당 필드 값을 허용하지 마십시오.

+0

죄송합니다. 이해하지 못했습니다. JSON 문자열이 비어 있으면 기본값을 사용하여 객체를 반환할까요? – giampaolo

+0

아니요, Gson을 해당 유형의 객체 작성기 기반으로 확장하는 방법을 의미합니다. 이는 자동으로 값 유형 팩토리가 정의한대로 일부 유형의 객체를 자동 채우기를 의미합니다. 또는 일부 무작위 값. –

답변

0

내가 궁금한 점이 있으면 Gson의 유형 어댑터를 찾을 수 있습니다. 이를 통해 custom serialization and deserialization을 만들 수 있습니다.

{ 
    "foo": ..., 
    "bar": ..., 

    "testInputParam": { 
    "startTime": {...}, 
    "name": "SomeName", 
    "num": 1 
    }, 

    "someArray": [...]  
} 

예를 들어, 다음과 같은 사용자 정의 디시리얼라이저를 작성할 수 있습니다 :

의는 다음과 같은 JSON 있다고 가정 해 봅시다

방금 ​​추가해야 디시리얼라이저 당신이 당신의 정의를 작성하면
private class TestInputParamDeserializer implements JsonDeserializer<TestInputParam> { 

    public TestInputParam deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException { 

    //This is the actual "testInputParam" JSON object... 
    JsonObject object = json.getAsJsonObject(); 

    //This is the custom object you will return... 
    TestInputParam result = new TestInputParam(); 

    //Fill in the "startDate" field with the current Date instead of the actual value in the JSON... 
    result.setStartDate = new Date(); 

    //Use the actual "name" found in the JSON... 
    result.name = object.get("name").getAsJsonString(); 

    //Fill in the "num" with a random value... 
    result.setNum = new Random().nextInt(); 

    //Finally return your custom object... 
    return result; 
    } 
} 

Gson 객체와 함께 :

GsonBuilder gson = new GsonBuilder(); 
gson.registerTypeAdapter(TestInputParam.class, new TestInputParamDeserializer()); 

이제을 사용할 때마다개체가 당신의 JSON 문자열을 역 직렬화하기 위해, 그것은 TestInputParam 클래스를 나타내는 JSON 개체를 발견 할 때마다, 그것은 사용자 정의 직렬화를 사용하지만 당신은 여전히 ​​... json으로 문자열의 나머지 부분에 대한 기본 직렬화를 사용할 수 있습니다


편집 :이 접근 방식을 사용하면 사용자 지정 직렬화/역 직렬화를 원하는 각 클래스에 대해 사용자 지정 serializer/deserializer를 작성해야합니다. 관련 유형 세트에 대한 유형 어댑터를 작성할 수있는 TypeAdapterFactory 클래스도 있습니다. 정보 및 예제 on Gson API documentation을 찾을 수 있습니다.

+0

네, 당신은 제 생각을 잡아냅니다.하지만 당신의 솔루션은 각 TestInputParam을 위해 하나씩 작성해야한다는 뜻입니까? –

+0

구현하고자하는 것은 일반 유형의 일반적인 솔루션입니다. 그것은 단지 객체 팩토리처럼, 기본 필드가 임의의 값 또는 사용자 정의 값을 가진 객체를 생성 할 수 있습니다. 다음과 같이 특별한 POJO에만 국한되지 않습니다. TestInputParam –

+0

@ JerryCai, EDIT를 참조하십시오. – MikO

관련 문제