2011-07-01 377 views
0

我有以下形式的JSON:如何从Python中的JSON中删除额外的方括号?

{"blah": 
[ 
    [ 
    {"first": 
    {"something":"that","something":"else","another":"thing","key":"value"}...[etc.] 
    } 
    ] 
] 
} 

,我试图用Python进行解析。我已经导入JSON(或simplejson,这取决于你使用的是什么版本的Python),一切都进行得很好,直到我得到这个块:

for result in page['blah']: 
    that = result['first'] 
    a_list.append(that) 

会抛出错误“类型错误:列表索引必须是整数,而不是str“。

我敢肯定,这个错误是由于额外的一对方括号,使JSON里面看起来像一个列表。

我的问题,假设是这种情况,是,我如何删除它,仍然有有效的JSON解析为字典?

欢迎使用其他解决方法。如果我需要提供更多信息,请告诉我。谢谢!

(添加缺少的括号和改变了一些容易混淆的名词 - 我试图拿出上飞通用术语,对不起任何混乱。)

+1

您似乎缺少一个大括号。 –

+0

你可以发布完整的代码,因为正如Zhehao Mao所说,你似乎错过了一条评论,并且很难判断你的问题是来自于此还是来自其他方面...... – seb

回答

1

如果有永远只有一个“额外”一组阵列括号:

for result in page['blah']: 
    that = result[0]['this'] 
    list.append(that) 
+0

Felix的回答正确地指出样本结构与您的代码示例不太匹配。如果你真的想要JSON对象的“内部”值,而不是最外面的大括号内的整个对象,那么你需要做这样的事情。 –

0

不需要从JSON字符串中删除括号。我认为确保只删除权利是不值得的。只要找出正确的方式来访问你想要的值。

“额外”括号不是唯一的问题。 this是一个对象的属性,它是值为first。所以访问this,你必须写

that = result[0]['first']['this'] 

这是否总是工作或不依赖于留出的JSON数据。

+0

啊,对不起,我正在动态地提供通用词汇。你是绝对正确的,并且放心,我在实际的代码中既不使用“this”也不使用“list”。 – Philoktetes

0

首先,您是对的 - 您的错误与Python数据类型和JSON输出的错误使用有关。

其次,创建变量时不要使用list和所有其他Python保留字。

最后,如果你只是想获得的所有结果“这个”内部密钥,你可以尝试使用下面的代码:

data = {"blah": 
[ 
    [ 
    {"first": 
    {"this":"that", 
    "something":"else","another":"thing","key":"value"}} 
    ] 
] 
} 
outres = [] 
for k,v in data.items():#iterate over top dictionary('blah',....) 
    for sv in v: # iterate through first list 
     for tv in sv: # iterate through second list 
      for fk,fv in tv.iteritems(): # iterate through each dicionary from second list 
       if 'this' in fv: 
        outres.append(fv['this']) 
print outres 

请注意,我的例子是基于你的数据样本 - 所以如果您的数据结构中有任何额外的级别,或者应该应用任何其他规则,那么应修改代码。