簡體   English   中英

使用Gson解析不同的JSON對象的列表

[英]Parsing a list of different JSON objects with Gson

如何解析下面的Json對象流? 有數組解析的示例,但沒有json對象流。 只有第一個對象不同,其他所有對象都相似。 它不是數組,而是json對象流。

[{
  "code": 200,
  "request_id": "52d868df5ada23e5f289320f",
  "ok": true,
  "payload_meta": {
    "original_size": 1837,
    "size": 1837
  }
},{
  "id": "4fb56d7f273fb7ebfe22783f",
  "duration": "6:49",
  "duration_seconds": 409,
  "size_bytes": 16396948
}{
  "id": "4fb56d7f273fb7ebfe227841",
  "duration": "3:42",
  "duration_seconds": 222,
  "size_bytes": 8904980
}{
  "id": "4fb56d7f273fb7ebfe227846",
  "duration": "4:06",
  "duration_seconds": 246,
  "size_bytes": 9843339
}]

以及如何在成功解析一個對象后通知,而不是等待整個流完成來通知。

對於您要反序列化的對象,我沒有做任何假設。 因此,我將Class1Class2命名為兩種對象,它們沒有關系。 我將它們聲明為內部靜態類以使該示例兼容,但是您可以將Class1Class2移到單獨的文件中。 我粘貼了一個准備好運行的代碼,以便您可以自己嘗試。

package stackoverflow.questions.q23556772;

import java.util.*;

import com.google.gson.*;

public class Q23556772 {

    public static class Class1 {
        String code;
        String request_id;
        Boolean ok;
        HashMap<String, Integer> payload_meta;

        @Override
        public String toString() {
            return "Class1 [code=" + code + ", request_id=" + request_id + ", ok=" + ok + ", payload_meta=" + payload_meta + "]";
        }

    }

    public static class Class2 {
        String id;
        String duration;
        Integer duration_seconds;
        Integer size_bytes;

        @Override
        public String toString() {
            return "Class2 [id=" + id + ", duration=" + duration + ", duration_seconds=" + duration_seconds + ", size_bytes=" + size_bytes + "]";
        }

    }


    public static void main(String[] args) {
     String json = 
             "[{                                                     "+
             "  \"code\": 200,                                       "+
             "  \"request_id\": \"52d868df5ada23e5f289320f\",        "+
             "  \"ok\": true,                                        "+
             "  \"payload_meta\": {                                  "+
             "    \"original_size\": 1837,                           "+
             "    \"size\": 1837                                     "+
             "  }                                                    "+
             "},{                                                    "+
             "  \"id\": \"4fb56d7f273fb7ebfe22783f\",                "+
             "  \"duration\": \"6:49\",                              "+
             "  \"duration_seconds\": 409,                           "+
             "  \"size_bytes\": 16396948                             "+
             "},{                                                    "+
             "  \"id\": \"4fb56d7f273fb7ebfe227841\",                "+
             "  \"duration\": \"3:42\",                              "+
             "  \"duration_seconds\": 222,                           "+
             "  \"size_bytes\": 8904980                              "+
             "},{                                                    "+
             "  \"id\": \"4fb56d7f273fb7ebfe227846\",                "+
             "  \"duration\": \"4:06\",                              "+
             "  \"duration_seconds\": 246,                           "+
             "  \"size_bytes\": 9843339                              "+
             "}]                                                     ";



     ArrayList<Object> result = new ArrayList<>();

     Gson g = new Gson();

     JsonArray e = new JsonParser().parse(json).getAsJsonArray();

     for(int i = 0; i < e.size(); i++){
         JsonObject o = e.get(i).getAsJsonObject();
         if (o.get("code") != null)
             result.add(g.fromJson(o, Class1.class));
         else if (o.get("id") != null)
             result.add(g.fromJson(o, Class2.class));
         else result.add(g.fromJson(o, Object.class));
     }

     for(Object resultObject: result)
         System.out.println(resultObject.toString());


    }

}

如您所見,我結合使用了JsonParser和Gson方法。 我使用解析器來查看“流”內部並確定要使用的正確類,然后使用標准Gson反序列化來完成工作。 可以將此代碼改編成自定義的TypeAdapter ,但可能會使代碼“復雜”,超出您的實際需求。

最后說明:我編輯了JSON,因為它不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM