如何从JSON流中删除特殊字符,以便我可以使用gson API将JSON对象转换为JAVA对象?

时间:2014-06-02 03:38:41

标签: json gson

我正在尝试使用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结果。

3 个答案:

答案 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构造函数,而是想要应用你自己的转换(去掉“%”,解析数字部分等)并返回与您的对象对应的相应数据类型。