2014-11-05 49 views
0

我想從我的模型創建以下JSONGSON屬性允許原始或複合映射

要麼我有

{"name" : "Arsénio", "value" : 12} 

{"name" : "Arsénio", "value" : {"min" : 12, "max" : 100, "value" : 200}} 

我已經定義了以下POJO的

class Data { 
    String name; 
    Value value; 
} 

abstract class Value {} 

class IntegerValue : Value { 
int value; 
} 

class RangeValue : Value { 
    int max, min, value; 
} 

顯然,這不會輸出我對於第一種情況需要JSON使用IntegerValue的時候,因爲它會輸出

Gson gson = new Gson(); 

Data data = new Data(); 
data.name = "Arsénio"; 
data.value = new IntegerValue(); 
data.value.value = 12; 

String result = gson.toJson(data, Data.class); 

System.out.println(result); 

輸出:

{"name": "Arsénio", "value" : {"value" : 12}} 

請告訴我型號你POJO在這種情況下,正確的方法?

回答

0

我已經設法通過使用IntegerValue的類型適配器來解決這個問題,不確定這是否是正確和簡單的解決方案,所以我會等一會兒才能接受我自己的答案。

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(IntValue.class, new IntegerValueTypeAdapter()) 
       .create(); 
public class IntValueTypeAdapter extends TypeAdapter<IntegerValue> { 

@Override 
public void write(JsonWriter out, IntegerValue value) throws IOException { 
    out.value(value.value); 
} 


@Override 
public IntegerValue read(JsonReader in) throws IOException { 
    // do something similar, but the other way around 
    throw new UnsupportedOperationException("deserialize not supported for IntegerValue"); 
} 

}

0

您可以編寫自定義TypeAdapter

public class ValueTypeAdapter extends TypeAdapter<Value> { 

    @Override 
    public Value read(JsonReader in) throws IOException { 

     Value value = null; 

     JsonParser jsonParser = new JsonParser(); 
     JsonElement je = jsonParser.parse(in); 

     if (je instanceof JsonPrimitive) { 
      value = new Value(); 
      value.value = ((JsonPrimitive) je).getAsInt(); 
     } else if (je instanceof JsonObject) { 
      JsonObject jsonObject = (JsonObject) je; 
      value = new Value(); 
      value.max = jsonObject.get("max").getAsInt(); 
      value.min = jsonObject.get("min").getAsInt(); 
      value.value = jsonObject.get("value").getAsInt(); 
     } 

     return value; 
    } 

    @Override 
    public void write(JsonWriter out, Value value) throws IOException { 
     if (value != null) { 
      if (value.min == 0 && value.max == 0) { 
       out.value(value.value); 
      } else { 
       out.beginObject(); 

       out.name("min").value(value.min); 
       out.name("max").value(value.max); 
       out.name("value").value(value.value); 

       out.endObject(); 
      } 
     } 
    } 
} 

你的POJO類:

public static class Data { 
    String name; 
    Value value; 
} 

public static class Value { 
    int max, min, value; 
} 

測試:

String json0 = "{\"name\" : \"Arsénio\", \"value\" : 12}"; 
    String json1 = "{\"name\" : \"Arsénio\", \"value\" : {\"min\" : 12, \"max\" : 100, \"value\" : 200}}"; 

    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(Value.class, new ValueTypeAdapter()); 
    Gson gson = gsonBuilder.create(); 

    // 1) Deserialize json to java instances 
    Data data0 = gson.fromJson(json0, Data.class); 
    Data data1 = gson.fromJson(json1, Data.class); 

    // 2) Serialize json to java instances to see your incoming json string equals to seriallize one 
    String serialized0 = gson.toJson(data0); 
    String serialized1 = gson.toJson(data1); 

    System.out.println("serialized0:" + serialized0); 
    System.out.println("serialized1:" + serialized1);