2012-07-05 2 views
1

새 객체가 아닌 객체에 키/값 쌍을 삽입하는 사용자 정의 직렬 변환기를 GSON에 생성하려고합니다. 예를 들어,이 supose :GSON을 사용하여 객체 대신에 임베디드 쌍 (키/값) 직렬화

class Car { 
    @Expose 
    String model; 
    @Expose 
    Manufacturer manufacturer; 
} 

class Manufacturer { 
    @Expose 
    String name; 
    @Expose 
    String from; 
} 

을 내가 JSON과 같이 다음 싶지 :

"car":{ 
    "model":"beatle", 
    "manufacturer":"volkswagen", 
    "country":"Germany" 
} 

하지만 시리얼 라이저를 코딩하는 방법에 상관없이, 그것은 "자동차"내부 제조 업체 개체를 만들 주장

"manufacturer":{ 
    "name":"volkswagen", 
    "country":"Germany" 
} 

키/값 쌍만 얻으려면 어떻게해야합니까?

추신 : 클래스를 의미있는 변경으로 만들 수 없습니다. 왜냐하면 클래스가 DB를 매핑하기 때문입니다. 그것은 단지 내 문제를 시뮬레이트하는 예입니다.

고맙습니다.

답변

0

JsonSerializer로 원하는 것을 만들 수 없습니다. 나는 2.1 (TypeAdapter 클래스) 이후로 만 GSON의 새로운 API로 제대로 작동하도록 만들 수 있었다. 하지만 "국가"를 삽입해야 할 { "폭스 바겐" "모델": : : "비틀즈", "제조업체"} :

public class ManufacturerSerializer extends TypeAdapter<Manufacturer> { 
    @Override 
    public void write(JsonWriter out, Manufacturer m) throws IOException { 
     out.value(m.getName()); 
     out.name("country"); 
     out.value(m.getFrom()); 
    } 

    /* I only need Serialization, dont use this */ 
    @Override 
    public Manufacturer read(JsonReader in) throws IOException { 
     return null; 
    } 
} 
1

맞춤 직렬 변환기를 사용하면 도움이됩니다.

private class ManufacturerSerializer implements JsonSerializer<Manufacturer> { 
    public JsonElement serialize(Manufacturer src, Type typeOfSrc, JsonSerializationContext context) { 
    return new JsonPrimitive(src.getName()); // or src.name public. 
    } 
} 

이를 참조하십시오 https://sites.google.com/site/gson/gson-user-guide/#TOC-Custom-Serialization-and-Deserialization

+1

그래서, 그것은 나에게 "차를"제공 "독일"쌍 너무, 그리고이 코드에서 어떻게 해야할지 모르겠다 – tpcordeiro

0

을 당신은 단지 사소한 방법으로 합성 클래스를 직렬화 피할 수 있지만, 당신이 필요로 그냥 뭐 렌더링 할 Car 클래스 serializerdeserializer을 소유 정의해야합니다. 예를 들어 당신이 문서에 설명 된대로 시리얼을 등록해야 기억

class CarSerializer implements JsonSerializer<Car> { 
    JsonElement serialize(Car src, Type typeOfSrc, JsonSerializationContext context) { 
    JsonObject o = new JsonObject(); 
    o.addProperty("manufacturer", src.manufacturer.name); 
    ... 
    } 
} 

을 정의하는 것, 전혀 어렵지 않다

.

+0

죄송합니다, 설명하는 것을 잊어 버렸습니다, 나는 자동차 클래스에 대한 사용자 지정 serialize를 만들고 싶지 않습니다. 대신 자동차 클래스는 많은 다른 많은 속성을 가지고 있기 때문에 제조업체 클래스를 직렬화해야합니다 (변경 가능, 포함 가능). – tpcordeiro

관련 문제