Python 如何解析没有根元素的JSON字符串?

Python 如何解析没有根元素的JSON字符串?,python,json,python-3.x,Python,Json,Python 3.x,我有一个JSON文件,如下所示: { "name":"A", "age":19 } { "name":"B", "age":20 } 因此,基本上该文件包含一个人员列表 我试图在Python3中使用json.loadsstr_内容,但它返回了错误json.decoder.JSONDecodeError:Extra data: 我用一个在线JSON解析器进行了检查,它告诉我同样的问题 如何在没有根元素但有JSON对象列表的情况下解析JSON文件?问题在于您试图解析的字符串不是有效

我有一个JSON文件,如下所示:

{
  "name":"A",
  "age":19
}
{
  "name":"B",
  "age":20
}
因此,基本上该文件包含一个人员列表

我试图在Python3中使用json.loadsstr_内容,但它返回了错误json.decoder.JSONDecodeError:Extra data:

我用一个在线JSON解析器进行了检查,它告诉我同样的问题


如何在没有根元素但有JSON对象列表的情况下解析JSON文件?

问题在于您试图解析的字符串不是有效的JSON文档。它实际上是JSON文档的串联。因此,简单的json.loads将无法工作

您可以使用基于的内容。例如:代码有点难看,但逻辑应该清楚:

import json

s = """{
  "name":"A",
  "age":19
}
{
  "name":"B",
  "age":20
}"""

def iter_jsons(s):
    decoder = json.JSONDecoder()

    i = 0
    while True:
        doc, i2 = decoder.raw_decode(s[i:].strip())
        yield doc
        if i == i2:
            break
        i= i2

print(list(iter_jsons(s)))
[{'name':'A','age':19},{'name':'B','age':20}]


问题是您试图解析的字符串不是有效的JSON文档。它实际上是JSON文档的串联。因此,简单的json.loads将无法工作

您可以使用基于的内容。例如:代码有点难看,但逻辑应该清楚:

import json

s = """{
  "name":"A",
  "age":19
}
{
  "name":"B",
  "age":20
}"""

def iter_jsons(s):
    decoder = json.JSONDecoder()

    i = 0
    while True:
        doc, i2 = decoder.raw_decode(s[i:].strip())
        yield doc
        if i == i2:
            break
        i= i2

print(list(iter_jsons(s)))
[{'name':'A','age':19},{'name':'B','age':20}]


这很有魅力

import json        
json_file = "myfile.json"

objects = json.load(open(json_file))

for person in objects:
    name = person['name']
    print(name)

这很有魅力

import json        
json_file = "myfile.json"

objects = json.load(open(json_file))

for person in objects:
    name = person['name']
    print(name)

age中有一个语法错误:20问题是您没有JSON文件;是什么创建了这个文件,可以修改成一个根数组吗?@Chirag谢谢,我修改了它。@jonrsharpe我想这个文件是从MongoDB创建的。事实上,我创建了一个BSON文件,然后将其转换为JSON。它是否存储在多行JSON中?像这样{name:A,age:19}{name:B,age:20}在新行中,age:20中有一个语法错误,问题是您没有JSON文件;是什么创建了这个文件,可以修改成一个根数组吗?@Chirag谢谢,我修改了它。@jonrsharpe我想这个文件是从MongoDB创建的。事实上,我创建了一个BSON文件,然后将其转换为JSON。它是否存储在多行JSON中?像这样{name:A,age:19}{name:B,age:20}每一行都在新行中如果没有嵌套的dict,您可以简单地查找右大括号并解析到该点。我在json标准中找不到任何指示json文档必须有根元素的内容。@TomasZubiri在,但是ABNF表示JSON文本是单个value@TomasZubiri:我相信该标准指出JSON文档必须是{,}括号中包含的单个JSON对象,或者是[,]括号中包含的逗号分隔的JSON对象列表。这个答案看起来像是一个非常聪明的解决办法,允许将这个不符合要求的输入解码到它应该首先出现的列表中。@tripleee:这是正确的,但是我不想对我试图解析的内容做任何假设。如果没有嵌套的dict,您可以简单地查找右括号并解析到该点。我在json标准中找不到任何指示json文档必须有根元素的内容。@TomasZubiri在,但是ABNF表示JSON文本是单个value@TomasZubiri:我相信该标准指出JSON文档必须是{,}括号中包含的单个JSON对象,或者是[,]括号中包含的逗号分隔的JSON对象列表。这个答案看起来像是一个非常聪明的解决办法,允许将这个不符合要求的输入解码到它本来应该在的列表中。@tripleee:这是正确的,但我不想对我试图解析的内容做任何假设。