GSON 2.2.4在包含以#符号开头的值的JSON上抛出错误

时间:2013-07-28 10:44:35

标签: exception character gson

我对可能出现的问题感到难过。我正在使用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”......} 。这可能是我唯一可能出错的预感。

1 个答案:

答案 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;