2013-05-07 16 views
10

私はいくつかのデータをJavaの要素に格納しており、それを指定された形式(JSONObject)で返す必要があります。私の実装は正常に動作しますが、私はまだeclipse(バージョン:Juno Service Release 2)からの警告メッセージを受け取ります:Javaタイプの安全警告のJSONとジェネリック

"タイプの安全性:put(Object、Object)メソッドは生の型HashMapに属します。

public interface Element {...} 

public abstract class AbstractElement implements Element {...} 

public final class Way extends AbstractElement {...} 

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

import org.json.simple.JSONArray; 
import org.json.simple.JSONObject; 

public class WayToJsonConverter{ 
    ... 
    public JSONObject wayToJson(){ 
     JSONObject obj = new JSONObject(); 
     obj.put("id",way.getId()); 
     ... 
     return obj; 
    } 
    ... 
} 

問題の行は次のとおりです:ジェネリック型のHashMapにこれは私のコードです

パラメータ化する必要がありますobj.put("id",way.getId());

これを解決する方法はありますそれ以外の場合は@SuppressWarnings("unchecked")を追加しますか?

+0

「getId()」の戻り値は何ですか? – SudoRahul

+0

戻り値の型は:String –

+0

この場合、 'obj.put(" id "、way.getId());'に問題はありません。それは警告を与える他の行でなければなりません! – SudoRahul

答えて

15

あなたのJSONObjectは何ですか、それはHashMapから継承していますか?ない場合は、インクルードは、おそらく次のようにあなたがJSONObjectのインスタンスを宣言する必要があることを意味警告:

JSONObject<String,Object> obj=new JSONObject<String,Object>(); 

更新:それはHashMapを拡張しますが、パラメータをサポートしていません

public class JSONObject extends HashMap 

:JSONObjectの定義を見てくださいその定義は

public class JSONObject<K,V> extends HashMap<K,V> 

であれば種類、我々は書くことができ

JSONObject<String,Object> obj=new JSONObject<String,Object>(); 

とputメソッドは、もはやあなたが別のライブラリに切り替えるか、それがジェネリックにするために、このライブラリのコードを変更することができない場合は、唯一の他のオプションはラッパーを書くことであろう警告

+11

私はそれをやろうとしていますが、「JSONObject型は一般的ではなく、引数でパラメータ化できません」 –

+0

サードパーティ。 https://code.google.com/p/json-simple/ –

+17

HashMapが拡張されていますが、クラス定義に型パラメータがないため、@SuppressWarningsを追加するのではなく何もできません(ここでは「未チェック」)... – ltebean

2

を生成します。それを使用し、ジェネリックを適切にサポートするこのライブラリです。

だからHashMap<String, Object>を拡張し、Map<String, Object>を実装し、org.json.simple.JSONObjectのすべてのメソッドの転送方法を含んでいるでしょうでしょう、org.json.simple.JSONObjectを含んでいるでしょう、独自のJSONObjectクラスを持っているでしょう。

このクラスにはまだ@SuppressWarnings("unchecked")を入れておく必要がありますが、このクラスに限定され、残りのすべてのコードには一般的な警告やその抑制がありません。

+1

私はまだsuppressWarningを使用する必要がある場合、私は問題を解決しなかったが、移動それ。今のところ、すべてのJSONの処理は1つのクラスで行われるので、あまり役に立ちません。さらに、私は実装しているインターフェイスのいくつかのメソッドにJSONObjectを返さなければならないので、Warpingはそれが私にとにかく役に立たないでしょう。これは、指定されたJSONパッケージの制限だと思われ、私はそれをより良く見せるために多くを行うことはできません。 –

0

FYI org.codehaus.jettison.json.JSONObjectこの警告は発生しません。 codehausのJSONObjectを使用すると、構文解析エラーをorg.codehaus.jettison.json.JSONException経由で捕捉することもできます。詳細はhttps://github.com/codehaus/jettisonを参照してください。

0

あなたがマップオブジェクトを作成し、JSONObject

Map<String, String> obj = new HashMap<String, String>(); 
obj.put("id",way.getId()); 
JSONObject jsonObj = (JSONObject) obj; 

に明示的なキャストを行います。しかし、これはあなただけのJSONで「文字列」が含ま制限することに注意してください可能性があります。別のデータ構造を記述すると、コンパイルエラーが表示されます。配列を言う。

+0

上記の場合、「警告を抑制する」アノテーションを追加する必要はありません – Kranthi

+0

'java.util.HashMapはorg.json.simple.JSONObjectにキャストできません ' –

0

もう1つのオプションは、(パラメータ化された)Map<String, Object>JSONObjectを初期化することです。そうすれば、有効なJSONタイプの値を指定でき、unchecked警告を回避できます。例えば。:

public class WayToJsonConverter{ 
    ... 
    public JSONObject wayToJson(){ 
     Map<String, Object> forJsonObj = new HashMap<>(); 
     forJsonObj.put("id",way.getId()); // No warning, hurray! 
     forJsonObj.put("integer", 14); 
     forJsonObj.put("floating", 1.4); 
     JSONObject obj = new JSONObject(forJsonObj); 
     ... 
     return obj; 
    } 
    ... 
} 
+0

' JSONObject'にはパラメータ化されたコンストラクタがありません。 –

+0

@ HarshPandey-答えに 'JSONObject'のパラメータ化されたコンストラクタを使用しません。 – asherbar

+0

'JSONObject obj =新しいJSONObject(forJsonObj); ' ここではパラメータ化されたコンストラクタを使用していませんか? –

関連する問題