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

Java 使用Gson解析不同JSON对象的列表,java,json,deserialization,gson,Java,Json,Deserialization,Gson,如何解析下面的Json对象流? 这里有数组解析的示例,但没有json对象流的示例。只有第一个对象不同于其他所有对象相似。 它不是数组,而是json对象流 [{ "code": 200, "request_id": "52d868df5ada23e5f289320f", "ok": true, "payload_meta": { "original_size": 1837, "size": 1837 } },{ "id": "4fb56d7f273fb7eb

如何解析下面的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
}]

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

我没有假设您尝试反序列化的对象类型。因此,我将
Class1
Class2
这两类对象命名,它们之间没有任何关系。我将它们声明为内部静态类以使compat成为示例,但是您可以将
Class1
Class2
移动到单独的文件中。我向您粘贴了一个随时可以运行的代码,以便您可以自己尝试

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());


    }

}
package stackoverflow.questions.q2356772;
导入java.util.*;
导入com.google.gson.*;
公开课Q23556772{
公共静态类1{
字符串代码;
字符串请求\u id;
布尔ok;
HashMap-payload\u-meta;
@凌驾
公共字符串toString(){
返回“Class1[code=“+code+”,request_id=“+request_id+”,ok=“+ok+”,payload_meta=“+payload_meta+”””;
}
}
公共静态类2{
字符串id;
字符串持续时间;
整数持续时间_秒;
整数大小_字节;
@凌驾
公共字符串toString(){
返回“Class2[id=“+id+”,duration=“+duration+”,duration_seconds=“+duration_seconds+”,size_bytes=“+size_bytes+”””;
}
}
公共静态void main(字符串[]args){
字符串json=
"[{                                                     "+
“代码”:200+
“请求id:\”52d868df5ada23e5f289320f\,“+
“确定”:正确+
“\”有效负载\元\“:{”+
“原始尺寸”:1837+
“\“大小\”:1837”+
"  }                                                    "+
"},{                                                    "+
“\“id\”:\“4fb56d7f273fb7ebfe22783f\”,”+
“持续时间”:“6:49”+
“\“持续时间\u秒\”:409,”+
“\“大小\字节\”:16396948”+
"},{                                                    "+
“\“id\”:\“4fb56d7f273fb7ebfe227841\”+
“持续时间:\”3:42\,“+
“\“持续时间\秒\”:222,”+
“\“大小\字节\”:8904980”+
"},{                                                    "+
“\“id\”:\“4fb56d7f273fb7ebfe227846\”+
“持续时间”:“4:06”+
“\“持续时间\秒\”:246,”+
“\“大小\字节\”:9843339”+
"}]                                                     ";
ArrayList结果=新建ArrayList();
Gson g=新的Gson();
JsonArray e=new-JsonParser().parse(json.getAsJsonArray();
对于(int i=0;i
如您所见,我使用了JsonParser和Gson方法的组合。我使用解析器查看“流”内部并确定要使用的正确类,然后使用标准Gson反序列化来完成这项工作。此代码可以改编成自定义的
类型适配器
,但它可能会使代码“复杂”超出您的实际需要


最后一点注意:我编辑了您的JSON,因为它不正确。

您的JSON格式无效,请检查这里。我刚才给出了一个JSON对象流的示例。格式可能不正确。我需要的是解析一个不是json数组格式的对象流。到目前为止,你尝试了什么?@giampaolo我厌倦了用回调作为列表对api进行改造,GSON未能对其进行排序。我也尝试了回调,在排序时也失败了。错误是“预期开始数组,但在第1行第2列是开始对象”如果你编辑你的问题提供更多的信息,你有更多的机会有人(包括我)可以回答。请看常见问题解答。