Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python2.7中创建JSON对象列表_Python_Json_Python 2.7_Dictionary - Fatal编程技术网

如何在Python2.7中创建JSON对象列表

如何在Python2.7中创建JSON对象列表,python,json,python-2.7,dictionary,Python,Json,Python 2.7,Dictionary,我正在将XML文件转换为JSON文件。为此,我打开xml,使用xmltodict模块,然后使用.get方法遍历树到我想要的级别。这一级的叶子是父母的。然后,我在特定条件下检查每个任务的某些叶子是否为true,如果为true,则使用json.dumps()并将其写入文件。问题是(我想这就是问题的根源)当我只在文件中附加一个JSON对象时,它不会在对象的末尾附加逗号,因为它认为它是唯一的对象。我试图通过在每个JSON对象的末尾添加一个“,”来解决这个问题,但是当我尝试使用JSON.loads()方法

我正在将XML文件转换为JSON文件。为此,我打开xml,使用
xmltodict
模块,然后使用.get方法遍历树到我想要的级别。这一级的叶子是父母的。然后,我在特定条件下检查每个
任务的某些叶子是否为true,如果为true,则使用
json.dumps()
并将其写入文件。问题是(我想这就是问题的根源)当我只在文件中附加一个JSON对象时,它不会在对象的末尾附加逗号,因为它认为它是唯一的对象。我试图通过在每个JSON对象的末尾添加一个“,”来解决这个问题,但是当我尝试使用
JSON.loads()
方法时,它会给我一个错误,说“没有JSON对象可以被解码”。但是,当我手动将“[”和“]”附加到文件时,它不会给我一个错误。我的代码如下,如果您有任何帮助/建议,我将不胜感激

def getTasks(filename):
    f = open(filename, 'r')
    a = open('tasksJSON', 'w')
    a.write('[')

    d = xmltodict.parse(f)
    l = d.get('Project').get('Tasks').get('Task')
    for task in l:
        if (task['Name'] == 'dinner'):  #criteria for desirable tasks
            j = json.dumps(task)
            a.write (str(j))   
            a.write(',')         

    a.write(']')
    f.close()
    a.close()
这可以工作,并将所有内容放入
tasksJSON
中,但正如我所说,当我调用

my_file = open('tasksJSON', 'r')
data = json.load(my_file)           # LINE THAT GIVES ME ERROR
我听到一个错误说

ValueError: No JSON object could be decoded
输出文件包含:

[{"UID": "4", "ID": "14", "Name": "Design"},{"UID": "5", "ID": "15", "Name": "Basic Skeleton"}]
                                           ^
                                 this is the comma I manually inserted

看起来,您将几个json对象放入一个文件中,并添加您自己的方括号。因此,它不能作为单个obj加载。看起来,您将几个json对象放入一个文件中,并添加您自己的方括号。因此,它不能作为单个obj加载。看起来,您将几个json对象放入一个文件中,并添加您自己的方括号。因此,它不能作为单个obj加载。看起来,您将几个json对象放入一个文件中,并添加您自己的方括号。因此,它不能加载为单个obj,因为JSON不允许在数组或对象的末尾添加额外的逗号。但是您的代码添加了这样一个额外的逗号。如果查看官方语法,则只能在另一个
值之前有一个
。Python的
json
库符合该语法,因此:

>>> json.loads('[1, 2, 3, ]')
ValueError: Expecting value: line 1 column 8 (char 7)
要解决此问题,您可以执行以下操作:

first = True
for task in l:
    if (task['Name'] == 'dinner'):  #criteria for desirable tasks
        if first:
            first = False
        else:
            a.write(',')
        j = json.dumps(task)
        a.write(str(j))   

另一方面,如果内存不是问题,只需将所有对象添加到列表中,然后
json.dumps
该列表,可能会更简单、更干净:

output = []
for task in l:
    if (task['Name'] == 'dinner'):  #criteria for desirable tasks
        output.append(task)
a.write(json.dumps(output))
或者,更简单地说:

json.dump([task for task in l if task['Name'] == 'dinner'], a)

(事实上,即使内存是一个问题,您也可以扩展
jsonecoder
,如中所示,通过将迭代器惰性地转换为JSON数组来处理迭代器,但这有点棘手,因此除非有人需要,否则我不会显示细节。)

JSON不允许在数组或对象的末尾添加逗号。但是您的代码添加了这样一个额外的逗号。如果查看官方语法,则只能在另一个
值之前有一个
。Python的
json
库符合该语法,因此:

>>> json.loads('[1, 2, 3, ]')
ValueError: Expecting value: line 1 column 8 (char 7)
要解决此问题,您可以执行以下操作:

first = True
for task in l:
    if (task['Name'] == 'dinner'):  #criteria for desirable tasks
        if first:
            first = False
        else:
            a.write(',')
        j = json.dumps(task)
        a.write(str(j))   

另一方面,如果内存不是问题,只需将所有对象添加到列表中,然后
json.dumps
该列表,可能会更简单、更干净:

output = []
for task in l:
    if (task['Name'] == 'dinner'):  #criteria for desirable tasks
        output.append(task)
a.write(json.dumps(output))
或者,更简单地说:

json.dump([task for task in l if task['Name'] == 'dinner'], a)

(事实上,即使内存是一个问题,您也可以扩展
jsonecoder
,如中所示,通过将迭代器惰性地转换为JSON数组来处理迭代器,但这有点棘手,因此除非有人需要,否则我不会显示细节。)

JSON不允许在数组或对象的末尾添加逗号。但是您的代码添加了这样一个额外的逗号。如果查看官方语法,则只能在另一个
值之前有一个
。Python的
json
库符合该语法,因此:

>>> json.loads('[1, 2, 3, ]')
ValueError: Expecting value: line 1 column 8 (char 7)
要解决此问题,您可以执行以下操作:

first = True
for task in l:
    if (task['Name'] == 'dinner'):  #criteria for desirable tasks
        if first:
            first = False
        else:
            a.write(',')
        j = json.dumps(task)
        a.write(str(j))   

另一方面,如果内存不是问题,只需将所有对象添加到列表中,然后
json.dumps
该列表,可能会更简单、更干净:

output = []
for task in l:
    if (task['Name'] == 'dinner'):  #criteria for desirable tasks
        output.append(task)
a.write(json.dumps(output))
或者,更简单地说:

json.dump([task for task in l if task['Name'] == 'dinner'], a)

(事实上,即使内存是一个问题,您也可以扩展
jsonecoder
,如中所示,通过将迭代器惰性地转换为JSON数组来处理迭代器,但这有点棘手,因此除非有人需要,否则我不会显示细节。)

JSON不允许在数组或对象的末尾添加逗号。但是您的代码添加了这样一个额外的逗号。如果查看官方语法,则只能在另一个
值之前有一个
。Python的
json
库符合该语法,因此:

>>> json.loads('[1, 2, 3, ]')
ValueError: Expecting value: line 1 column 8 (char 7)
要解决此问题,您可以执行以下操作:

first = True
for task in l:
    if (task['Name'] == 'dinner'):  #criteria for desirable tasks
        if first:
            first = False
        else:
            a.write(',')
        j = json.dumps(task)
        a.write(str(j))   

另一方面,如果内存不是问题,只需将所有对象添加到列表中,然后
json.dumps
该列表,可能会更简单、更干净:

output = []
for task in l:
    if (task['Name'] == 'dinner'):  #criteria for desirable tasks
        output.append(task)
a.write(json.dumps(output))
或者,更简单地说:

json.dump([task for task in l if task['Name'] == 'dinner'], a)
(事实上,即使内存是一个问题,您也可以扩展
jsonecoder
,如中所示,通过将迭代器惰性地转换为JSON数组来处理迭代器,但这有点棘手,因此除非有人需要,否则我不会显示细节。)

这样做:

def getTasks(filename):
    f = open(filename, 'r')
    a = open('tasksJSON', 'w')
    x = []
    d = xmltodict.parse(f)
    l = d.get('Project').get('Tasks').get('Task')
    for task in l:
        if (task['Name'] == 'dinner'):  #criteria for desirable tasks
            #j = json.dumps(task)
            x.append(task)
            #a.write (str(j))   
            #a.write(',')         

    a.write(json.dumps(x))
    f.close()
    a.close()
这样做:

def getTasks(filename):
    f = open(filename, 'r')
    a = open('tasksJSON', 'w')
    x = []
    d = xmltodict.parse(f)
    l = d.get('Project').get('Tasks').get('Task')
    for task in l:
        if (task['Name'] == 'dinner'):  #criteria for desirable tasks
            #j = json.dumps(task)
            x.append(task)
            #a.write (str(j))   
            #a.write(',')         

    a.write(json.dumps(x))
    f.close()
    a.close()
这样做:

def getTasks(filename):
    f = open(filename, 'r')
    a = open('tasksJSON', 'w')
    x = []
    d = xmltodict.parse(f)
    l = d.get('Project').get('Tasks').get('Task')
    for task in l:
        if (task['Name'] == 'dinner'):  #criteria for desirable tasks
            #j = json.dumps(task)
            x.append(task)
            #a.write (str(j))   
            #a.write(',')         

    a.write(json.dumps(x))
    f.close()
    a.close()
这样做:

def getTasks(filename):
    f = open(filename, 'r')
    a = open('tasksJSON', 'w')
    x = []
    d = xmltodict.parse(f)
    l = d.get('Project').get('Tasks').get('Task')
    for task in l:
        if (task['Name'] == 'dinner'):  #criteria for desirable tasks
            #j = json.dumps(task)
            x.append(task)
            #a.write (str(j))   
            #a.write(',')         

    a.write(json.dumps(x))
    f.close()
    a.close()

JSON只是字符串,一组由逗号分隔并用括号括起来的有效JSON对象构成有效的JSON数组。JSON就是字符串,一组由逗号分隔并用括号括起来的有效JSON对象构成有效的JSON数组。JSON就是字符串,一组由逗号分隔并用括号括起来的有效JSON对象构成一个有效的JSON数组。JSON只是字符串,一组由逗号分隔并用括号括起来的有效JSON对象构成一个有效的JSON数组。这很有意义,感谢@abarnet。但是我还是有点困惑。我将向您展示此代码中的输出文件。更新above@bagelboy:您发布的输出文件不是真正的输出文件,并且不包含相同的问题,因此它当然可以工作。如果添加与实际输出文件相同的问题,则会得到相同的错误。更多细节请参见我对问题的评论。这很有意义,谢谢@abarnet。但是我还是有点困惑。我会