无法使用GSON解析/读取JSON

时间:2018-10-05 14:38:18

标签: java android json while-loop gson

我正在使用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();
    }

如果有人能阐明一点会很好吗?

3 个答案:

答案 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