首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >难以使用jsonline解析对象

难以使用jsonline解析对象
EN

Stack Overflow用户
提问于 2018-04-10 08:29:20
回答 1查看 4.2K关注 0票数 3

我在使用jsonline解析请求正文时遇到了困难。我使用龙卷风作为服务器,这是在post()方法中发生的。我的目的是将请求的主体解析为单独的JSON,然后使用jsonlines迭代它们,对每个JSON进行一些工作,然后将它们推送到DB中。我通过将utf-8编码的主体转储到文件中解决了这个问题,然后使用:

代码语言:javascript
复制
with jsonlines.open("temp.txt") as reader:

这对我有用。我可以遍历整个文件

代码语言:javascript
复制
for obj in reader:

我只是觉得这是一种不必要的开销,如果我能够理解是什么使我不能仅仅使用这段代码,就可以减少这种开销:

代码语言:javascript
复制
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中如下所示):

代码语言:javascript
复制
{"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提供的行来再现异常:

代码语言:javascript
复制
log = self.request.body.decode("utf-8")
with jsonlines.Reader(log) as currentlog:
    for obj in currentlog:
        print("obj")

作为旁白:邮递员以文本形式发送数据,而不是JSON。

如果你需要更多的信息来回答这个问题,请告诉我。我注意到的一件事是,从decode方法返回的字符串以一个引号开始和结束。我想这是因为JSON本身的双引号。这有什么关系吗?举个例子:

代码语言:javascript
复制
'{"type":"event","timestamp":"2018-03-25 09:19:50.999","event":"ButtonClicked","params":{"screen":"MainScreen","button":"SettingsButton"}}'

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 14:59:15

jsonlines.Reader接受可迭代作为arg (“第一个参数必须是生成JSON编码字符串的可迭代性”,而不是像您的示例中那样json编码的单个字符串),但是在.decode("utf-8")之后,日志将是一个字符串,它恰好支持可迭代接口。因此,当读取器在next(log)下调用时,它将获得日志字符串的第一项,即字符{,并尝试将其处理为明显无效的json行。在将日志传递给读取器之前尝试log = log.split()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49748899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档