1
{
"localeCode": "",
"map": {
    "DynamicName1": [],
    "DynamicName2": [
        {
            "date": "2016-05-15T00:00:00",
            "seqId": 1,
            "status": 10
        },
        {
            "date": "2016-05-16T00:00:00",
            "seqId": 83,
            "status": 10
        }
    ],
    "DynamicName3": [],
    "DynamicName4": []
},
"respCode": 100,
"respMsg": "success",
"status": 1
}

この種の json を正しくマップする方法。あなたがそれを見ることができればDynamic、動的な名前です。これまでのところ、私はこれを行ってきました:

public class MapModel {

public MapObject map;

public static class MapObject{
    public java.util.Map<String, Student> queryStudent;

    public static class Student{
        public String date;
        public String seqId;
        public String status;
    }
}
}

しかし、アプリを実行すると。私は得てNullPointerExceptionいます。誰か助けてくれませんか?

4

1 に答える 1

3

Jsonを逆シリアル化しようとしているときに正しく入力されていないため、内部にNullPointerExceptionアクセスしています。queryStudentMapObjectMapModel

したがって、問題を解決するには、Gson のドキュメントを参照してください。

具体的なことを何もせずに Gson を使用してコレクションをシリアル化できます。 toJson(collection) は目的の出力を書き出します。

ただし、Gson は入力を型にマップする方法を知る方法がないため、fromJson(json, Collection.class) を使用した逆シリアル化は機能しません。Gson では、fromJson() でコレクション型の汎用バージョンを提供する必要があります。したがって、次の 3 つのオプションがあります。

  1. Gson のパーサー API (低レベルのストリーミング パーサーまたは DOM パーサー JsonParser) を使用して配列要素を解析し、各配列要素で Gson.fromJson() を使用します。これが推奨される方法です。これを行う方法を示す例を次に示します。

  2. 各配列メンバーを調べて適切なオブジェクトにマップする Collection.class の型アダプターを登録します。このアプローチの欠点は、Gson の他のコレクション型の逆シリアル化を台無しにすることです。

  3. MyCollectionMemberType の型アダプターを登録し、Collection で fromJson() を使用します。

あなたMapObjectの内容は ajava.util.Mapですが、クラス自体は一般的ではないため、あなたの場合の良いアプローチは a を作成することだと思いますDeserializer.

これを行う前に、デシリアライザーを簡単に構築できるようにコンストラクターを提供するために、クラス定義をクリーンアップしてください。POJOクラスは次のようになります

学生クラス

public class Student{
  public String date;
  public String seqId;
  public String status;

  public Student(String date, String seqId, String status){
      this.date = date;
      this.seqId = seqId;
      this.status = status;
  }
}

MapObject クラス

注:MapあなたのJsonでは、それぞれに複数の学生がいる可能性があるため(質問からDynamicName見てください)、定義を変更します。DynamicName2Map<String,List<Student>>Map<String,Student>

public class MapObject{
   public Map<String,List<Student>> queryStudent;

   public MapObject(Map<String,List<Student>> value){
       this.queryStudent = value;
   }
}

MapModel クラス

public class MapModel {
     public MapObject map;     
}

を作成DeserializerしますMapObject

public class MapObjectDeserializer implements JsonDeserializer<MapObject> {
  public MapObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {

      Map<String,List<Student>> queryStudents = new HashMap<String,List<Student>>();
      // for each DynamicElement...
      for (Map.Entry<String,JsonElement> entry : json.getAsJsonObject().entrySet()) {

          List<Student> students = new ArrayList<Student>();
          // each dynamicElement has an Array so convert  and add an student
          // for each array entry
          for(JsonElement elem : entry.getValue().getAsJsonArray()){
              students.add(new Gson().fromJson(elem,Student.class));
          }
          // put the dinamic name and student on the map
          queryStudents.put(entry.getKey(),students);
      }
      // finally create the mapObject
      return new MapObject(queryStudents);
  }
}

最後に、 JsonDeserializerを登録して解析します。

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MapObject.class, new MapObjectDeserializer());
Gson gson = builder.create();
MapModel object = gson.fromJson(YourJson,MapModel.class);

免責事項: 迅速なプロトタイピングのために、 groovyを使用してこれをテストします。Java構文を維持しようとしますが、何かを忘れることがあります。とにかく、これで正しい方向に進むことができると思います。

それが役に立てば幸い、

于 2016-05-18T11:07:07.433 に答える