我在使用jsonline解析请求正文时遇到了困难。我使用龙卷风作为服务器,这是在post()方法中发生的。我的目的是将请求的主体解析为单独的JSON,然后使用jsonlines迭代它们,对每个JSON进行一些工作,然后将它们推送到DB中。我通过将utf-8编码的主体转储到文件中解决了这个问题,然后使用:
with jsonlines.open("temp.txt") as reader:这对我有用。我可以遍历整个文件
for obj in reader:我只是觉得这是一种不必要的开销,如果我能够理解是什么使我不能仅仅使用这段代码,就可以减少这种开销:
log = self.request.body.decode("utf-8")
with jsonlines.Reader(log) as reader:
for obj in reader:我得到的例外是:
jsonlines.jsonlines.InvalidLineError: line包含无效的json:期望以双引号括起来的属性名称:第1行,列2 (char 1) (第1行)
我尝试在这里搜索这个错误,我发现的只是一些例子,人们尝试使用格式不正确的jsons,其中有一个引号,而不是双引号。对我来说不是这样。我调试了请求,并看到从decode方法返回的字符串实际上具有属性和值的双引号。
下面是我发送的请求正文的一个示例(在Postman中如下所示):
{"type":"event","timestamp":"2018-03-25 09:19:50.999","event":"ButtonClicked","params":{"screen":"MainScreen","button":"SettingsButton"}}
{"type":"event","timestamp":"2018-03-25 09:19:51.061","event":"ScreenShown","params":{"name":"SettingsScreen"}}
{"type":"event","timestamp":"2018-03-25 09:19:53.580","event":"ButtonClicked","params":{"screen":"SettingsScreen","button":"MissionsButton"}}
{"type":"event","timestamp":"2018-03-25 09:19:53.615","event":"ScreenShown","params":{"name":"MissionsScreen"}}您可以通过在post方法中使用这段简单的代码并发送我通过Postman提供的行来再现异常:
log = self.request.body.decode("utf-8")
with jsonlines.Reader(log) as currentlog:
for obj in currentlog:
print("obj")作为旁白:邮递员以文本形式发送数据,而不是JSON。
如果你需要更多的信息来回答这个问题,请告诉我。我注意到的一件事是,从decode方法返回的字符串以一个引号开始和结束。我想这是因为JSON本身的双引号。这有什么关系吗?举个例子:
'{"type":"event","timestamp":"2018-03-25 09:19:50.999","event":"ButtonClicked","params":{"screen":"MainScreen","button":"SettingsButton"}}'谢谢你的帮助!
发布于 2018-04-10 14:59:15
jsonlines.Reader接受可迭代作为arg (“第一个参数必须是生成JSON编码字符串的可迭代性”,而不是像您的示例中那样json编码的单个字符串),但是在.decode("utf-8")之后,日志将是一个字符串,它恰好支持可迭代接口。因此,当读取器在next(log)下调用时,它将获得日志字符串的第一项,即字符{,并尝试将其处理为明显无效的json行。在将日志传递给读取器之前尝试log = log.split()。
https://stackoverflow.com/questions/49748899
复制相似问题