13

org.eclipse.jetty.util.ajax.JSONを使用して JSON テキストを解析しています。しかし、JSON.parse(string)メソッドは Object を生成し、それを Map として必要とします。内部的には、まさに言及されたクラスのオブジェクトです。しかし、新しいオブジェクトを構築したり、チェックされていないキャストの警告を受けたりせずに、オブジェクトをマップにキャストするにはどうすればよいでしょうか?

現在、チェックされていないキャスト警告なしで1つの解決策しか見つかりませんでしたが、実際にはもちろんキャストではありません。

private Map<String,Object> getMap(String string) {
    HashMap<String,Object> result = new HashMap<>();
    Object object = JSON.parse(string);
    if (object instanceof Map) {
        Map<?,?> map = (Map)(object);
        for (Map.Entry<?,?> entry : map.entrySet()) {
            String key = entry.getKey().toString();
            Object value = entry.getValue();
            result.put(key,value);
        }
    }
    return result;
}

では、チェックされていないキャスト警告なしで適切にキャストする方法はありますか?

4

1 に答える 1

13

コンパイラは、キャストが安全であることを保証できません。あなたは保証をする人なので、あなたは使うべきです@SuppressWarnings("unchecked")

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/SuppressWarnings.html

@TedHopp が指摘しているように、ライブラリが使用されることになっている方法は、返された各値を既知Objectの型にキャストすることです (ただし、取得するすべてのプロパティをキャストする必要があります) http:/のマッピングを参照してください。 /download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.html

それがもたらすポイントは、この JSON オブジェクトに他の JSON オブジェクト (オブジェクトへのマップ) のみが含まれていることを保証していることです。

したがって、何らかの理由で入力が渡された場合

// properties are not quoted for readability
{ a: 2, b : {c:3} }

試してみると、コードは無効なキャスト例外で失敗します

map.get("a")

したがって、JSON に解析している文字列に何が入るかを保証するのはあなたであることを忘れないでください。

保証できない場合は、この getMap 関数を作成することはできません。@SupressWarnings特定のオブジェクトがどのタイプであるかを知っている場所でキャスト (および) を行う必要があります。

JSON を扱う際の型の安全性については、次のことを学ぶ必要があります。

これらのクラスを使用すると、JSON を直接 Java クラスに読み込むことができます

于 2012-10-17T05:07:28.883 に答える