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

标签 json gson

我正在尝试使用 Google gson API 将 JSON 对象序列化为 java 对象。
我需要从这个流中删除特殊字符以进行序列化。
我如何实现这一目标?

这是我从请求中得到的 JSON 对象:

{"color":"北极白","imageUrl":"http://www.xyz.com/images/z/1/7/8/8/2/1/1788212-p-DETAILED.jpg", "styleId":"1788212","originalPrice":"$64.95","price":"$64.95","productUrl":"http://www.xyz.com/product/7515478/color/51609","percentOff ":"0%"}

但是,当我尝试使用 Google 的 gson API 将其反序列化为 JAVA 对象时 - 它需要没有任何特殊字符的 JSON 对象,因此在遇到“$”和“%”时会引发异常。如何在不影响 json 对象的其余部分的情况下摆脱这些字符,即作为字符串获得的 json 结果。

最佳答案

它按预期完美运行。无需从 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));

关于json - 如何从 JSON 流中删除特殊字符,以便我可以使用 gson API 将 JSON 对象转换为 JAVA 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23987030/

相关文章:

json - Firebase - 仅获取 JSON 结构的 "title"

java - 如何在 RetroFit 中使用 Gson 转换器?

android - 使用Gson实现parcelable接口(interface)

java - Gson:基于另一个字段的动态字段解析

java - 将对象转换为 JSON 字符串时发生 JsonMappingException - org.apache.avro.AvroRuntimeException : Not an array:

ios - 如何使用AFNetworking获取URL的内容?

json - 如何在Dart中创建特定类型的嵌套JSON数据?

java - json反序列化遇到一些问题

java - 致命异常 : java. lang.RuntimeException - 由 java.lang.IllegalStateException 引起。应为 BEGIN_ARRAY,但实际为 BEGIN_OBJECT

java - 通过Gson将对象转换为Json时出现OutOfMemory异常