-1

何が問題なのか困っています。私は 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 ブロックがあります。

このアプリケーションのほとんどのユーザーは、ここで概説されているような例外のトリップを回避するという明確な目的で文字列/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 に答える