1

我正在使用一个网络服务,不幸的是我无法控制它,有一个名为 price 的元素可以有两种类型的值,它可以是双精度值:

price: 263.12

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

price: "263.12;Y"

在第二种情况下 ;N 表示可以修改价格(即:可以添加折扣),我试图说服服务的开发人员修改响应并发送 Y 或 N(视情况而定)一个单独的值(折扣:“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);  

从来没有真正调用过setter,在将价格设置为适当的双精度的情况下,它工作得很好,但是在我收到字符串的地方它只是崩溃了,任何关于如何处理的建议,最坏的情况我可以创建第二个 POJO 并尝试/捕获对象创建,但应该有更好的想法,到目前为止搜索没有产生任何结果。

4

2 回答 2

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

当您想访问/获取pricedouble,请在 getter 中适当地转换它。

于 2013-06-18T13:30:03.207 回答
1

您可以实现TypeAdapter覆盖默认序列化的 a 。您必须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 文档了解更多信息。

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

于 2013-06-17T20:20:16.787 回答