如何解析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
}]
还有如何在成功解析一个对象后通知,而不是等待整个流完成。
答案 0 :(得分:0)
我没有假设您尝试反序列化的对象类型。所以我将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());
}
}
如您所见,我使用了JsonParser和Gson方法的组合。我使用解析器来查看“流”内部并确定要使用的正确类,然后我使用标准Gson反序列化来完成工作。此代码可以调整为自定义TypeAdapter
,但可能会使代码“复杂”超出您的实际需求。
最后注意事项:我编辑了你的JSON,因为它不正确。