我对可能出现的问题感到难过。我正在使用GSON(2.2.4)来序列化/反序列化我在JTable中显示的简单json对象和数组。一切正常,但是当我像这样喂一个json对象时:
{ “1”:{ “336”: “#1700EB”, “17”: “#EB0000”, “10”: “#EB0000”, “26”: “#1700EB”, “3”:” #1700EB”, “1”: “#EB0000”}}
它会抛出此错误:
com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 71
at com.google.gson.Gson.fromJson(Gson.java:813)
at com.google.gson.Gson.fromJson(Gson.java:768)
at com.google.gson.Gson.fromJson(Gson.java:717)
当我移除井号时,它正常运行。
以下是执行转换的代码:
Map<String, String> conv = null;
Type type = new TypeToken<Map<String, String>>(){}.getType();
ListMultimap<String, Object> returnMap = ArrayListMultimap.create();
try {
conv = g.fromJson(parse, type);
for(String key : conv.keySet()) {
returnMap.put("Key", key);
returnMap.put("Value", conv.get(key));
}
} catch (JsonSyntaxException jse) {
type = new TypeToken<Map<String, Object>>(){}.getType();
conv = g.fromJson(parse, type);
for(Object key : conv.keySet()) {
returnMap.put("Key", key);
returnMap.put("Value", conv.get(key));
}
}
请注意我正在开发一个“遗留”应用程序,而我几乎无法控制我正在处理的代码部分的值;这就是为什么我有那个奇怪的try-catch块。
此应用程序的大多数用户都不足以精明地处理他们的字符串/ jsons,其明确目的是避免绊倒异常(例如此处概述的异常)(例如,在将其传递给应用程序时不包括#符号;但是在将其添加回来时他们需要它,所以我真的想在代码中修复它。
谢谢!
编辑:我忘了添加一个重要的细节。我正在用代码做的是以表格形式显示数据。当用户选择单元格时,它根据上下文进行处理。在包含json对象或数组的单元格的上下文中,它使用上面的代码从json中提取值并将其作为表模型的新表数据传递。因此,样本json对象理想情况下应该像这样(想象表格形式)
336 | #1700EB 17 | #EB0000 10 | #EB0000 26 | #1700EB 3 | #1700EB 1 | #EB0000
......但它没有到达那里。具有json对象的单元格的上一个表格如下所示:
1 | {336 =#1700EB,17 =#EB0000,10 =#EB0000,26 =#1700EB,1 =#EB0000}
此表单是否与错误有关?据我所知,json对象形式应该是这样的(至少与我合作的形式): {“336”:“#1700EB”......} 。这可能是我唯一可能出错的预感。
答案 0 :(得分:0)
感谢你们的努力。我能够解决这个问题,老实说,我仍然不知道根本原因。无论如何,我重构了代码,没有进行使用Type进行映射的初始尝试。显然,它导致了下游的问题。
以下是好奇的修改代码:
Map<String, Object> conv = null;
Type type = new TypeToken<Map<String, Object>>(){}.getType();
ListMultimap<String, Object> returnMap = ArrayListMultimap.create();
conv = g.fromJson(parse, type);
for(Object key : conv.keySet()) {
returnMap.put("Key", key);
Object check = conv.get(key.toString());
if ((check.toString().startsWith("{") && check.toString().endsWith("}")) ||
(check.toString().startsWith("[") && check.toString().endsWith("]")))
check = g.toJson(check);
returnMap.put("Value", check);
}
return returnMap;