我正在尝试使用Google gson API将JSON对象序列化为java对象。 我需要从此流中删除特殊字符以进行序列化。 我如何实现这一目标?
这是我从请求中获得的JSON对象:
{“color”:“Arctic White”,“imageUrl”:“http://www.xyz.com/images/z/1/7/8/8/2/1/1788212-p-DETAILED。 JPG”, “styleId”: “1788212”, “originalPrice”: “$ 64.95”, “价格”: “$ 64.95”, “PRODUCTURL”: “http://www.xyz.com/product/7515478/color/51609” “percentOff”: “0%”}
但是,当我尝试使用Google的gson API将其反序列化为JAVA对象时,它需要没有任何特殊字符的JSON对象,因此当它遇到'$'和'%'时会抛出异常。如何在不影响json对象的其余部分的情况下摆脱这些字符,即以字符串形式获得的json结果。
答案 0 :(得分:3)
它按预期完美运作。无需从JSON流中删除这些特殊字符即可将其转换为Java对象。
请看下面的示例代码:
BufferedReader reader = new BufferedReader(new FileReader(new File("json.txt")));
MyJSONObject data = new Gson().fromJson(reader, MyJSONObject.class);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));
class MyJSONObject {
private String color;
private String imageUrl;
private String styleId;
private String originalPrice;
private String price;
private String productUrl;
private String percentOff;
// getter & setter
}
输出:(由于StackOverflow站点的约束,我已从输出中删除了URL)
{
"color": "Arctic White",
"styleId": "1788212",
"originalPrice": "$64.95",
"price": "$64.95",
"percentOff": "0%"
}
您可以尝试使用JsonDeserializer根据需要对其进行反序列化。
我已在其上发布了示例代码。找到它HERE
以下是使用JsonDeserializer
的示例代码。
示例代码:
BufferedReader reader = new BufferedReader(new FileReader(new File("resources/json29.txt")));
class MyJSONObject {
private String color;
private String imageUrl;
private String styleId;
private double originalPrice;
private double price;
private String productUrl;
private double percentOff;
// getter & setter
}
class MyJSONObjectDeserializer implements JsonDeserializer<MyJSONObject> {
@Override
public MyJSONObject deserialize(final JsonElement json, final Type typeOfT,
final JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
MyJSONObject myJSONObject = new MyJSONObject();
myJSONObject.setColor(jsonObject.get("color").getAsString());
myJSONObject.setImageUrl(jsonObject.get("imageUrl").getAsString());
myJSONObject.setStyleId(jsonObject.get("styleId").getAsString());
myJSONObject.setProductUrl(jsonObject.get("productUrl").getAsString());
try {
String price = jsonObject.get("price").getAsString();
String originalPrice = jsonObject.get("originalPrice").getAsString();
String percentOff = jsonObject.get("percentOff").getAsString();
myJSONObject.setPrice(Double.valueOf(price.substring(1)));
myJSONObject.setOriginalPrice(Double.valueOf(originalPrice.substring(1)));
myJSONObject.setPercentOff(Double.valueOf(percentOff.substring(0,
percentOff.length() - 1)));
} catch (NumberFormatException e) {
e.printStackTrace();
}
return myJSONObject;
}
}
MyJSONObject data = new GsonBuilder()
.registerTypeAdapter(MyJSONObject.class, new MyJSONObjectDeserializer()).create()
.fromJson(reader, MyJSONObject.class);
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));
答案 1 :(得分:0)
最简单的方法是将流转换为字符串,使用正则表达式或其他东西来替换不需要的字符,然后调用gson将更正后的字符串转换为所需的Java对象。
答案 2 :(得分:0)
据我了解,你的对象的JSON表示包含一个值,例如“0%”(从JSON的角度来看,这是正式的字符串)。这肯定是有效的JSON,GSON应该接受它...如果你将它反序列化为设计为包含String的东西。
我的猜测是你实际上希望将“0”反序列化为数字类型。在这种情况下,您不能依赖GSON自动执行您想要的操作,您需要编写custom deserializer。
上面链接中的示例显示了如何为DateTime对象执行此操作:
private class DateTimeDeserializer implements JsonDeserializer<DateTime> {
public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return new DateTime(json.getAsJsonPrimitive().getAsString());
}
}
在你的情况下,你仍然需要做一个getAsString(),但是你不想将它传递给DateTime构造函数,而是想要应用你自己的转换(去掉“%”,解析数字部分等)并返回与您的对象对应的相应数据类型。