我正在使用网络服务,遗憾的是我没有任何控制权,有一个名为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并尝试/捕获对象创建,但是应该有更好的想法,到目前为止搜索没有产生任何结果。
答案 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)
您可以撰写TypeAdapter
或JsonDeserializer
。
你也可以依靠这样一个事实,即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中正确转换。