为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用 GSON 解析/读取 JSON

无法使用 GSON 解析/读取 JSON

holdtom 2021-10-28 15:27:58
我正在使用 GSON 库来解析一个简单的 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();    }如果有人能透露一些信息,那就太好了?
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

假设你不明确需要使用Reader:基本上你的JSON包含一个Array或一个List的Map秒。如果您知道结果需要什么以及如何告诉Gson您要反序列化的内容,那么反序列化很容易。


下面两个例子:


@SuppressWarnings("unchecked")

List<Map<?, ?>> mapList = new Gson().fromJson(JSON, List.class);

以上将反序列化任何通用类型的地图并猜测值的类型。这会产生类似于ArrayList<Map<String, Object>值是Strings 或Doubles 的情况。


要明确地告诉Maps 泛型类型,可以这样做:


Type tMap = TypeToken.getParameterized(Map.class, String.class, String.class).getType();

Type tjson = TypeToken.getArray(tMap).getType();


Map<String, String>[] mapList = new Gson().fromJson(json, tjson);


查看完整回答
反对 回复 2021-10-28
?
森林海

TA贡献2011条经验 获得超2个赞

如前所述,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)

}


查看完整回答
反对 回复 2021-10-28
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

以下是如何使用 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 的推荐方法。


查看完整回答
反对 回复 2021-10-28
  • 3 回答
  • 0 关注
  • 219 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信