我正在尝试从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”。
它是这样的:
根据https://jsonformatter.curiousconcept.com/,JSON文件有效。
在调试模式下,甚至可以在JSONObject中识别“ Uhrzeit”:
我认为这可能与条目本身有关,因此我将“基准”和“ Ort”切换到文档中的第一位,但是产生了相同的结果。
在此错误消息上还发布了许多其他信息,但在我看来,他们都遇到了稍有不同的问题。
答案 0 :(得分:1)
我将包含数据的.csv导入MongoDB并从那里读取文档。在读取数据的过程中,在\ .csv中的换行符处(即每个数据集的末尾)自动生成了“ \ r”。在这种情况下,键值对为“反馈”(如上图所示)。
当使用另一个JSON验证器再次检查我的输出时,我注意到我的JSON文件中有一个"invisible" symbol,导致找不到该密钥。现在,在将.csv文档导入到我的数据库时,此符号位于第一个键的前面(在MongoDB-id之后)。我将正确版本的.csv导入到我的MongoDB中,然后再次将其导出,并且该符号再次出现。
问题是我的.csv是“ Windows”格式。将其转换为“ Unix”格式将摆脱生成的“ \ r”。 “不可见”符号是在文档开头添加的UTF-8-BOM代码。您可以将.csv重新格式化为UTF-8,然后以这种方式删除它。