【问题标题】:Cannot read the first line of a JSON file in Java无法读取 Java 中 JSON 文件的第一行
【发布时间】:2018-06-27 09:39:22
【问题描述】:

我正在尝试从我从 MongoDB 文档生成的 JSON 文件中读取一些数据。但是当试图读取文档中的第一个条目时,我得到一个异常:

org.json.JSONException: JSONObject["Uhrzeit"] 未找到。

这只发生在第一个条目上,读取其他条目不会导致异常。 在不是第一个条目的任何条目上使用 jsonObject.getString("") 会按预期返回值。

    //Initiate Mongodb and declare the database and collection
    MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost:27017"));
    MongoDatabase feedbackDb = mongoClient.getDatabase("local");
    MongoCollection<Document> feedback = feedbackDb.getCollection("RückmeldungenShort");

    //gets all documents in a collection. "new Document()" is the filter, that returns all Documents
    FindIterable<Document> documents = feedback.find(new Document());

    //Iterates over all documents and converts them to JSONObjects for further use
    for(Document doc : documents) {

        JSONObject jsonObject = new JSONObject(doc.toJson());

        System.out.print(jsonObject.toString());
        System.out.print(jsonObject.getString("Uhrzeit"));

    }

打印jsonObject.toString() 生成用于测试目的的 JSON 字符串(一行):

{  
   "Ort":"Elsterwerda",
   "Wetter-Keyword":"Anderes",
   "Feedback\r":"Test Gelb\r",
   "Betrag":"Gelb",
   "Datum":"18.05.2018",
   "Abweichung":"",
   "Typ":"Vorhersage",
   "_id":{  
      "$oid":"5b33453b75ef3c23f80fc416"
   },
   "Uhrzeit":"05:00"
}

注意,条目出现的顺序是混淆的,出现在数据库中的第一个是“Uhrzeit”。

看起来是这样的:

JSON文件根据https://jsonformatter.curiousconcept.com/有效。

在调试模式下,甚至可以在 JSONObject 中识别“Uhrzeit”:

我认为这可能与条目本身有关,因此我将“Datum”和“Ort”切换到文档中的第一位,但产生了相同的结果。

还有很多其他人发布了此错误消息,但在我看来,他们的问题略有不同。

【问题讨论】:

  • 您能否遍历 JSONObject 中的键并查看是否提供任何线索? (stackoverflow.com/questions/9151619/…)
  • 好吧,如链接中第一个答案中所述,遍历键只会打印“_id”。我正在努力为此提供一些格式化的代码,但它似乎不起作用......
  • 使用这个:stackoverflow.com/a/32412500/9977047,我得到了所有的键和值。但是缺少一个关键,这次是“反馈”。尽管打印了“反馈”键的值。像这样:“Ort:Elsterwerda”“Wetter-Keyword:Anderes”“:Test Gelb”
  • 猜测,可能是反馈键中的回车符导致了问题。有什么方法可以删除它并检查您是否仍然得到相同的行为?
  • “\r”似乎在从数据库中取出时自动插入到文档中。这可能是问题所在。

标签: java json mongodb csv utf-8


【解决方案1】:

我将带有我的数据的 .csv 导入 MongoDB 并从那里读取文档。在读取数据的过程中,“\r”s 会自动生成在我的 .csv 中的换行符(也就是在每个数据集的末尾)。在这种情况下,在键值对“反馈”处(如上图所示)。

当使用另一个 JSON 验证器再次检查我的输出时,我注意到我的 JSON 文件中有一个 "invisible" symbol 导致找不到密钥。现在,当将 .csv 文档导入我的数据库时,此符号位于第一个键的前面(在 MongoDB-id 之后)。我将正确版本的 .csv 导入到我的 MongoDB 中,然后再次导出,符号再次出现。

问题是我的 .csv 是“Windows”格式。将其转换为“Unix”格式将摆脱生成的“\r”。 “不可见”符号是添加在文档开头的 UTF-8-BOM 代码。您可以将 .csv 重新格式化为 UTF-8 并以这种方式摆脱它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2019-02-25
    • 2022-07-21
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多