使用GSON解析具有混合类型的对象

时间:2013-06-17 18:49:00

标签: java android gson

我正在使用网络服务,遗憾的是我没有任何控制权,有一个名为price的元素可以有2种类型的值,它可以是双重的:

price: 263.12

或具有特定格式的字符串:

price: "263.12;Y"

在第二种情况下,; N表示可以修改价格(即:可以添加折扣),我试图说服服务的开发人员修改响应并发送Y或N(取决于case)在一个单独的值(折扣:“Y”|“N :),但他们说现在他们不会这样做。

在我为此案例宣布的POJO中,我有以下情况:

private float precio;
public void setPrice(String value){
    if(value.indexOf(";") == -1){
        price = Float.parseFloat(value);
    } else {
        String[] p = value.split(";");
        price = Float.parseFloat(p[0]);
    }
}
public float getPrice(){return price;}

但不幸的是使用:

Product obj = new Gson().fromJson(response, Product.class);  

实际上从来没有cals the setter,在价格被设置为正确的双倍的情况下,它工作得很好,但是我收到字符串它只是崩溃,任何关于如何处理它的建议,最坏的情况场景我可以创建第二个POJO并尝试/捕获对象创建,但是应该有更好的想法,到目前为止搜索没有产生任何结果。

2 个答案:

答案 0 :(得分:1)

您可以实现覆盖默认序列化的TypeAdapter。您必须为某个班级注册TypeAdapter ...

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Product.class, new ProductAdapter());
Gson gson = builder.create();

...所以这样任何Product类型的成员......

String jsonString = gson.toJson(somethingThatContainsProducts); 

...将由TypeAdapter

处理
public class ProductAdapter extends TypeAdapter<Product> {

  public Product read(JsonReader reader) throws IOException {
    if (reader.peek() == JsonToken.NULL) {
      reader.nextNull();
      return null;
    }

    String json = reader.nextString();

    // convert String to product ... assuming Product has a 
    // constructor that creates an instance from a String
    return new Product(json);
  }

  public void write(JsonWriter writer, Product value) throws IOException {
    if (value == null) {
      writer.nullValue();
      return;
    }

    // convert Product to String .... assuming Product has a method getAsString()
    String json = value.getAsString();
    writer.value(json);
  }
} 

查看Google GSON documentation了解更多信息。

希望这有帮助......干杯!

答案 1 :(得分:1)

您可以撰写TypeAdapterJsonDeserializer

你也可以依靠这样一个事实,即Gson会为你按摩类型,并按照你的类型采取其他方式:

class Pojo { String price; }
...
String json = "{\"price\":1234.5}";
Pojo p = new Gson().fromJson(json, Pojo.class);
System.out.println(p.price);

产生

  

1234.5

当您想要price作为double进行访问时,请在getter中正确转换。