web-dev-qa-db-ja.com

ArrayList <String>をJSON配列に追加する方法-型の安全性を念頭に置いて

Eclipseは型安全性の警告を表示し、私はそれを根絶するためにほぼすべてを試みました(もちろん、それを抑制することはオプションです)が、残念ながら私は成功しませんでした。
型安全性の警告が表示されないようにコードを変更する方法を知っていますか。それとも@SuppressWarnings("unchecked")が唯一の方法ですか?

ArrayList<String> arrayList= (ArrayList<String>) Classname.getArrayList();      
JSONArray obj = new JSONArray();
obj.addAll(arrayList); 

次のタイプの安全警告が最後の行に表示されます。

型安全性:メソッドaddAll(Collection)は、生の型ArrayListに属しています。ジェネリック型ArrayListへの参照はパラメーター化する必要があります

JSONArrayはfromorg.json.simple.JSONArray。別のパッケージをお勧めしますか?

10
Brenne

Jsonで作業したい場合は、このライブラリにアクセスしてください。このライブラリには、Niceサポートがあります https://code.google.com/p/google-gson/

これは例です:

Gson gson = new Gson();
Collection<Integer> ints = Lists.immutableList(1,2,3,4,5);

(Serialization)
String json = gson.toJson(ints); ==> json is [1,2,3,4,5]

ありがとう

3
Felquir

org.jsonおよびorg.json.simpleJSONパーサーは、その下にある生のタイプのコレクションを使用します。良いGenericsサポートを探しているなら Google Gson を試してください。ジェネリックArrayListをGsonでシリアル化する方法は次のとおりです。

Gson gson = new Gson();

ArrayList<String> arrayList= (ArrayList<String>) ClassName.getArrayList();

// Serializing to a JSON element node
JsonElement jsonElement = gson.toJsonTree(arrayList);
System.out.println(jsonElement.isJsonArray()); // true

// Or, directly to JSON string
String json = gson.toJson(arrayList);
System.out.println(json);

同じJSON文字列をGenericsをそのままにして逆シリアル化する方法は次のとおりです。

Type type = new TypeToken<ArrayList<String>>(){}.getType();
ArrayList<String> arrayList = gson.fromJson(json, type);
3
Ravi Thapliyal

あなたの質問に対する簡単な答えは、それが消えるにはそれを抑制しなければならないということです。問題は、addAllメソッドを使用して何を入力するかではなく、型が指定されていない場合、JSONArrayが型の安全性を保証する方法がないためです。

JSONArrayはパラメータ化されていないArrayListを継承し、addAllメソッドは次のように定義されます。

public boolean addAll(Java.util.Collection<? extends E> es)

Typeパラメーターを指定しない場合、EはObjectにフォールバックします。これにより、addAllメソッドは、既存のコレクションの上にANYTHINGを含むコレクションを追加できるメソッドになります。したがって、次のようなことができます。

List<Dog> dogs = new ArrayList<Dog>();
dogs.add(new Chiwawa());

List<Car> cars = new ArrayList<Car>();
cars.add(new BMW());

JSONArray jsonArray = new JSONArray();
jsonArray.addAll(dogs);
jsonArray.addAll(cars);

犬と車は同じJSONArray(ArrayList)に一緒に追加され、かろうじてオブジェクトとして扱われます。このようなことをすると、オブジェクトのいずれかを取り戻すときに、それが犬か車かを判断する方法がありません。これが警告が存在する理由です。

ジェネリック型パラメーター(Dogなど)を使用すると、addAll定義は次のようになります。

 public boolean addAll(Java.util.Collection<? extends Dog> es)

これにより、パラメータがDogとDogの子クラスのコレクションのみを受け入れることができるようになります。したがって、コレクションから取得する場合は、取得オブジェクトをDogに割り当てても安全です。

警告は、あなたが何か間違ったことをしたからではありません。これは、JSONArrayがパラメータ化されていないコレクションを継承しているためです。自由に抑制してください。

1
KKKCoder

Gson ライブラリを使用してArrayListJsonArrayに変換します。

Gson gson = new GsonBuilder().create();
JsonArray myCustomArray = gson.toJsonTree(myCustomList).getAsJsonArray();
0
Priyanka Gupta

JSONArrayのドキュメントから、生の型はextends ArrayListのように見えます(ジェネリック型パラメーターはありません)。これは非ジェネリックレガシーコードを処理する例であり、続行する唯一の方法は、JSONArrayがいくつかのStringを受信することを期待していることを確認してから、警告を抑制することです。 。

(これを修正する実際の方法は、ジェネリックを使用するようにJSONArrayを更新することですが、それまでの間、raw型を使用する必要があります。)

0