如何在Python 2.7中创建JSON对象列表

时间:2014-09-15 19:53:22

标签: python json python-2.7 dictionary

我正在将XML文件转换为JSON文件。我这样做是通过打开xml,使用xmltodict模块然后使用.get方法将树遍历到我想要的级别。这个级别是叶子的父母。然后我检查某个条件,即每个task的一些叶子是真的,如果是,那么我使用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

3 个答案:

答案 0 :(得分:1)

JSON不允许在数组或对象的末尾添加额外的逗号。但是你的代码添加了一个额外的逗号。如果您查看官方语法here,则只能在另一个 , 之前有value。 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)

(事实上,即使内存 是一个问题,你可以扩展JSONEncoder,如the docs所示,通过将它们懒惰地转换为JSON数组来处理迭代器,但这有点棘手,所以除非有人需要,否则我不会透露细节。)

答案 1 :(得分:1)

这样做:

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()

答案 2 :(得分:0)

看来,您将几个json对象放入文件并添加自己的方括号。因此,它不能作为单个obj加载