斜杠上的Gson MalformedJsonException

时间:2014-05-06 16:47:46

标签: java android json deserialization gson

我正在尝试用Gson反序列化一个类。

这是我试图反序列化的类:

public class Product {

    public String id;
    public String name;
    public String expDate;
    public String iconPath;

    public Product(final String id, final String name, final String expDate, final String iconPath) {
        this.id = id;
        this.name = name;
        this.expDate = expDate;
        this.iconPath = iconPath;
    }

    @Override
    public final String toString() {
        return new Gson().toJson(this);
    }

}

这是使用的代码:

final String serializedProducts = PreferenceManager.getDefaultSharedPreferences(activity).getString("products_" + sectionNumber, null);
if(serializedProducts != null) {
    final Gson gson = new GsonBuilder().create();
    final List<?> deserializedProducts = gson.fromJson(serializedProducts, List.class);
    final List<Product> result = new ArrayList<Product>();
    for(final Object product : deserializedProducts) {
        //System.out.println(product.toString());
        result.add(gson.fromJson(product.toString(), Product.class));
    }
}

这是System.out.println(...)

的输出
{expDate=4/6/2014, iconPath=/data/data/fr.skyost.fridge/files/images/5000112558265, id=5000112558265, name=Coca-Cola Zéro}

{expDate=4/6/2014, iconPath=/data/data/fr.skyost.fridge/files/images/5000112558265, id=5000112558265, name=Coca-Cola Zéro}

{expDate=4/6/2014, iconPath=/data/data/fr.skyost.fridge/files/images/3564700371107, id=3564700371107, name=Eau minérale}

我在第1行第12列(斜杠)处遇到异常MalformedJsonException

那么如何进行反序列化呢?

谢谢;)

1 个答案:

答案 0 :(得分:2)

JSON要求引用字符串值(包括关键字)。 JSON的名称/值分隔符是冒号,而不是等号。

因此要成为有效的JSON文本应该是:

{"expDate":"4/6/2014", "iconPath":"/data/.../5000112558265", "id":5000112558265, "name":"Coca-Cola Zéro"}

有关详细信息,请参阅http://json.org

我刚刚注意到你的toString实现使用GSON来生成表面上的JSON输出,但是没有使用toString方法,或者GSON对构成有效JSON的内容有非常错误的理解。我的期望是它肯定是前者。

我现在看到问题,我想,现在我看得更近了;无论它们是什么,反序列化的对象都不是Product的实例。所以下面的代码:

for(final Object product : deserializedProducts) {
    //System.out.println(product.toString());
    result.add(gson.fromJson(product.toString(), Product.class));

不会调用Product.toString,但任何对象toString的{​​{1}}都会生成并添加到列表中。

您应该将gson.fromJson(serializedProducts, List.class);添加到调试输出中以证明这一点。然后你应该调查如何获得product.getClass()创建的实际实例。