我正在尝试用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
。
那么如何进行反序列化呢?
谢谢;)
答案 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()
创建的实际实例。