Java 使用Gson解析不同JSON对象的列表
如何解析下面的Json对象流? 这里有数组解析的示例,但没有json对象流的示例。只有第一个对象不同于其他所有对象相似。 它不是数组,而是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
[{
"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列是开始对象”如果你编辑你的问题提供更多的信息,你有更多的机会有人(包括我)可以回答。请看常见问题解答。