如何使用 GSON 解析 prettyprinted JSON

How to parse prettyprinted JSON with GSON

我正在连接到一些 API。这些调用 return 已经 "prettyprinted" JSON 而不是一行 JSON.

示例:

[
  {
    "Field1.1": "Value1.1",
    "Field1.2": "value1.2",
    "Field1.3": "Value1.3"
  },
  {
    "Field2.1": "Value2.1",
    "Field2.2": "value2.2",
    "Field2.3": "Value2.3"
  }
]

当我尝试使用 GSON 解析这样的 JSON 时,它会抛出 JsonSyntaxException。

代码示例:

BufferedReader br = /*Extracting response from server*/
JsonElement jelement = new JsonParser().parse(br.readLine())

有没有办法解析 JSON 这样格式的文件?

编辑:

我试过直接使用 Gson:

BufferedReader jsonBuf = ....
Gson gson = new Gson();
JsonObject jobj = gson.fromJson(jsonBuf, JsonObject.class)

但是当代码终止时 jobj 为 NULL。

我还尝试将包含在 BufferedReader 中的字符串解析为单行字符串,然后在其上使用 JsonParser:

import org.apache.commons.io.IOUtils
BufferedReader jsonBuf = ....
JsonElement jEl = new JsonParser().parse(IOUtils.toString(jsonBuf).replaceAll("\s+", "");

但是我最后得到的JsonElement是一个NULL指针...

我不明白我做错了什么...

BufferedReader::nextLine 只读取一行。您要么从 reader 读取整个 json 到某个 String 变量,要么您将使用 Gson::fromJson(Reader, Type) 并将 reader 直接传递给此方法。

由于您的 json 看起来像一个 json 对象数组,因此可以使用 TypeToken 将其反序列化为 List<Map<String,String>> :

BufferedReader bufferedReader = ...
Type type = new TypeToken<List<Map<String,String>>>(){}.getType();
Gson gson = new Gson();
List<Map<String,String>> newMap = gson.fromJson(bufferedReader, type);

您也可以根据需要使用一些自定义对象而不是 Map