【问题标题】:Parse array of objects as array of String using Gson使用 Gson 将对象数组解析为字符串数组
【发布时间】:2017-05-15 08:29:11
【问题描述】:

我有一个很大的 JSON 文件 (> 1Gb),其中包含一组对象:

[
   {
      "Property1":"value",
      "Property2":{
         "subProperty1":"value",
         "subProperty2":[
            "value",
            "value"
         ]
      },
      "Property3":"value"
   },
   {
      "Property1":"value",
      "Property2":{
         "subProperty1":"value",
         "subProperty2":[
            "value",
            "value"
         ]
      },
      "Property3":"value"
   }
]

目前,我使用 Gson 解析这个 JSON,但它不起作用,我有以下错误:java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

为了解析这个 JSON,我做了以下操作:

reader = new BufferedReader(new FileReader(jsonFile));
Gson gson = new GsonBuilder().create();
Type typeArray = new TypeToken<List<String>>(){}.getType();
List<String> topics = gson.fromJson(reader, typeArray);

我想将此 JSON 数组解析为字符串数组。换句话说,我想要一个 Java 字符串列表而不是 Java 对象列表。像这样:

topics[0] = "{\"Property1\":\"value\",\"Property2\":{\"subProperty1\":\"value\",\"subProperty2\":[\"value\",\"value\"]},\"Property3\":\"value\"}";
topics[1] = "{\"Property1\":\"value\",\"Property2\":{\"subProperty1\":\"value\",\"subProperty2\":[\"value\",\"value\"]},\"Property3\":\"value\"}";

谢谢你:)

【问题讨论】:

  • 我不确定它是否有效。解析整个文件并将单个对象重新格式化回 json 字符串有什么问题?是内存问题吗?
  • @Thomas 我认为这不是内存问题。我认为这是一个解析问题。对于我的测试,我有一点 JSON (~10Mb)
  • 你能检查一下 JSON 文件的字符集编码吗?例如,它可能是 UTF 字节顺序标记的问题。请粘贴一个可以复制的最小示例 JSON。
  • @MickMnemonic 我的 JSON 文件的字符集编码似乎很好。它适用于 json-simple API,但我需要 Gson 来解析巨大的 Json 文件。 Here 是我的 JSON 文件的原始提取,here 是格式化的提取。这是一个只有 2 个复杂对象的数组,但最后,它需要在同一个数组上工作,但有大约 500,000 个复杂对象(~1Gb)

标签: java json parsing gson


【解决方案1】:

这样的事情应该可以工作:

public List<String> convertToStringArray(File file) throws IOException {
    List<String> result = new ArrayList<>();
    String data = FileUtils.readFileToString(file, "UTF-8");
    JsonArray entries = (new JsonParser()).parse(data).getAsJsonArray();
    for (JsonElement obj : entries)
        result.add(obj.toString());
    return result;
}

我使用了来自apache.commons.io 的文件阅读器,但您可以将其替换为原生 Java 阅读器...此外,如果您需要在每个字符串中使用 topics[0] =,您可以添加:

result.add(String.format("topics[%s] = %s", result.size(), obj.toString()));

这些是从 gson 使用的导入:

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多