努力使用 jsonlines 解析对象

struggling to parse an object using jsonlines

我在使用 jsonlines 解析请求正文时遇到问题。我正在使用龙卷风作为服务器,这是在 post() 方法中发生的。 我这样做的目的是将请求的主体解析为单独的 JSON,然后使用 jsonlines Reader 对它们进行迭代,对每个进行一些处理,然后将它们推送到数据库。 我通过将 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 contains invalid json: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) (line 1)

我尝试在此处搜索此错误,但我发现的只是人们尝试使用格式不正确的 json 的示例,这些 json 使用单引号而不是双引号。我不是这样的。我调试了请求,发现解码方法中 returns 的字符串确实对属性和值都有双引号。

这是我发送的请求正文的示例(这是它在 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")

作为旁注:Postman 将数据作为文本发送,而不是 JSON。

如果您需要更多信息来回答这个问题,请告诉我。 我注意到的一件事是解码方法中 returns 的字符串以一个引号开头和结尾。我猜这是因为 JSON 本身的双引号。它有任何关系吗? 一个例子:

'{"type":"event","timestamp":"2018-03-25 09:19:50.999","event":"ButtonClicked","params":{"screen":"MainScreen","button":"SettingsButton"}}'

感谢您的帮助!

jsonlines.Reader 接受可迭代作为 arg("The first argument must be an iterable that yields JSON encoded strings" 不是 json-encoded 单个字符串,如您的示例),但是,在 .decode("utf-8") 之后,日志将是一个字符串,恰好支持可迭代接口。因此,当 reader 在幕后调用 next(log) 时,它将获得日志字符串的第一项,即字符 { 并将尝试将其作为 json-line 处理,这显然是无效的。在将日志传递到 Reader 之前尝试 log = log.split()