-1

我很困惑可能是什么问题。我正在使用 GSON (2.2.4) 序列化/反序列化简单的 json 对象和数组,它们显示在 JTable 中。一切正常,但是当我提供这样的 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 块。

此应用程序的大多数用户不够精明,无法将其字符串/json 用于避免像此处概述的那样触发异常的明确目的(例如,在通过应用程序时不包括 # 符号;但在需要时将其添加回来),所以我真的很想在代码中修复它。

谢谢!

编辑:我忘了添加一个重要的细节。我对代码所做的是以表格形式显示数据。当用户选择一个单元格时,它会根据上下文进行处理。在包含 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"...}。这可能是我对可能出了什么问题的唯一预感。

4

1 回答 1

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;
于 2013-07-28T11:13:23.213 回答