5

これが私のjson文字列で、Javaでアクセスしています。

json = 
[
    {"id":"123456","Data":"skill2","dmlcrud":false},
    {"id":"123456","Data":"skill3","dmlcrud":true},
    {"id":"123456","Data":"skill14","dmlcrud":true},
    {"id":"123321","Data":"skill1","dmlcrud":false},
    {"id":"123321","Data":"skill14","dmlcrud":false}
]

私は今それをコレクションに入れたいので、理想的/理論的には次のことをしたいと思います。

List<Person> personList = new Gson().fromJson(json, Person.class);

そして、personList.size()は= 5になります。次に、personListをループして、関連するアクションを実行します。

ただし、私の理解では、個人リストを含むコンテナクラスを作成する必要がありますか?したがって、代わりに(簡潔にするためにパブリックゲッター/セッターを削除しました。おそらく構文エラーもあります)。

Class Person {
   private integer id;
   private String Data;
   private Boolean dmlCrud ;
}

私は実際に次のようなものが必要になりますか?

Class container{
   List<Person> personList;


   static class Person {
      private integer id;
      private String Data;
      private Boolean dmlCrud ;
   }
}

ただし、javascript jsonを変更して、まったく異なるものにする必要がありますか?JSON.stringifierを使用してjavascript配列からjson文字列を作成しているので、これはかなり問題があるようです。

ありがたいことにどんな助けも受けました。

編集

私が使用した解決策は、追加することでした

public List<Person> personList;

人物クラスに変更し、jsonオブジェクトを変更して

{ "personList" :
    [
        {"id":"123456","Data":"skill2","dmlcrud":false},
        {"id":"123456","Data":"skill3","dmlcrud":true},
        {"id":"123456","Data":"skill14","dmlcrud":true},
        {"id":"123321","Data":"skill1","dmlcrud":false},
        {"id":"123321","Data":"skill14","dmlcrud":false}
    ]
}

gson呼び出しは次のようになります

Person person = new Gson().fromJson(json, Person.class);

そして、そのようなリストでアクセスされるデータ

List<Person> personList = person.getPersonList();

編集2

2番目の、より良い解決策は、このjson配列を使用することです

[
        {"id":"123456","Data":"skill2","dmlcrud":false},
        {"id":"123456","Data":"skill3","dmlcrud":true},
        {"id":"123456","Data":"skill14","dmlcrud":true},
        {"id":"123321","Data":"skill1","dmlcrud":false},
        {"id":"123321","Data":"skill14","dmlcrud":false}
]

その後、

Type listType = new TypeToken<List<SkillsGsonTO>>() {}.getType();
List<Person> personList  = new Gson().fromJson(json,listType);
Person person1 = personList.get(0);

元のクラスが使用される場所

Class Person {
       private integer id;
       private String Data;
       private Boolean dmlCrud ;
    }
4

1 に答える 1

1

Containerクラスを使用することもできますが、これは、個人リストに追加のプロパティを送信する必要がある場合にのみ意味があります。そうでない場合は、java.util.Listに変換することもできます。リストプロパティの「名前」をJSON文字列のルート要素として指定する必要があると思います。したがって、たとえば、ドメインオブジェクトがPersonオブジェクトのリストである場合、JSONルート要素は「persons」または「personList」です。つまり、JSONは次のようになります。

"persons" : {[
     {"id":"123456","Data":"skill2","dmlcrud":false},
     {"id":"123456","Data":"skill3","dmlcrud":true},
     {"id":"123456","Data":"skill14","dmlcrud":true},
     {"id":"123321","Data":"skill1","dmlcrud":false},
     {"id":"123321","Data":"skill14","dmlcrud":false}
]}

構文が少しずれている可能性がありますが、これに似たものになるはずです。要約すると:

あなたの場合、あなたはあなたをPersonクラスのままにしておくことができ、gsonは私が提案したJSON文字列からあなたのためにListpersonsを作成できるはずです。

Gson APIドキュメントから:逆シリアル化するオブジェクトがParameterizedTypeである場合(つまり、少なくとも1つの型パラメーターを含み、配列である可能性がある場合)、fromJson(String、Type)メソッドを使用する必要があります。ParameterizedTypeを逆シリアル化する例を次に示します。

 Type listType = new TypeToken<List<String>>() {}.getType();

 Gson gson = new Gson();
 List<String> target2 = gson.fromJson(json, listType);

したがって、あなたの場合は次のようになります。

Type listType = new TypeToken<List<Person>>() {}.getType();
List<Person> persons = new Gson().fromJson(json, listType);

ここで、jsonは明らかにjson文字列です

于 2010-09-07T10:53:51.570 に答える