我正在使用GSON库来解析一个简单的JSON,该JSON在所有对象(不限于4个)上具有相似的键值对,如下所示:
[
{
"A": "xyz",
"B": "mno",
"C": 368,
"E": 1,
"F": "pqr"
},
{
"A": "qwe",
"B": "def",
"C": 338,
"D": 7,
"E": 1,
"F": null
},
{...
},
{...
}
]
当我阅读/迭代GSON阅读器以解析值时,我得到
Expected BEGIN_OBJECT but was STRING on line 7 of the following code
我尝试了读取和迭代的各种组合,但是我无法理解使用while(reader.hasNext())背后的逻辑
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
while (reader.hasNext()) {
if (reader.nextName().equals("A")) {
while (reader.hasNext()) {
reader.beginObject();
while (reader.hasNext()) {
readPostObject(reader, queue);
}
reader.endObject();
}
} else {
reader.skipValue();
}
}
reader.endObject();
}
reader.endArray();
}
如果有人能阐明一点会很好吗?
答案 0 :(得分:0)
如前所述,Gson是将JSON解析为纯Java对象的绝佳工具。
请参阅下面的示例(用Kotlin编写):
data class Abc(val A: String, val B: String, val C: Int, val E: Int, val F: String)
fun parseAbcList(json: String): List<Abc> {
return Gson().fromJson<List<Abc>>(json, object : TypeToken<List<Abc>>() {}.type)
}
答案 1 :(得分:0)
这里是如何使用Java对象(如我在评论中提到的)的示例:
class MyJsonObject {
public String A;
public String B;
public Integer C;
public Integer D;
public Integer E;
public String F;
}
// Serialization
Gson gson = new Gson();
List<MyJsonObject> myJsonObjects = gson.toJson(MyJsonObject[].class);
System.out.println(myJsonObjects[0].A); // xyz
这是使用GSON解析JSON的推荐方法。
答案 2 :(得分:0)
假定您不需要显式使用Reader
:基本上,您的JSON
包含Array
的{{1}}或List
。如果您知道结果需要什么并如何告诉Map
您要反序列化的内容,反序列化将很容易。
以下两个示例:
Gson
以上将反序列化任何通用类型的map并猜测值的类型。这将产生类似@SuppressWarnings("unchecked")
List<Map<?, ?>> mapList = new Gson().fromJson(JSON, List.class);
的值,其中值是ArrayList<Map<String, Object>
或String
。
要明确地告诉Double
的泛型类型,可以执行以下操作:
Map