在json对象中查找键

时间:2016-01-17 22:53:51

标签: python json

我试图制作一个区域类来总结关键区域的所有实例'在json字符串中。

例如e = Area('[1, 2, 3, {"area": 123, "weight": 1000}]')应返回e=123,此Area('["Hello", "World", {"area": 999}, {"area": 1}]')应返回1000。

目前我每次都会返回0,我认为这可能是因为我过早地初始化sum或因为我对字符串的索引可能已关闭。

import json
class Area:

    def __init__(self, txt):
        self.txt=txt

    def __str__(self):
        sum=0
            for a in self.txt:
                if a == 'area':
                    sum+=int(self.txt[a]})
        return str(sum)

2 个答案:

答案 0 :(得分:1)

使用json.loads很好但你需要确保你有一个可以用isinstance做的字典,你可以使用内置的sum函数为你做总结。

import json
class Area:
    def __init__(self, txt):
        self.txt = txt
    def __str__(self):
        return str(sum(d.get("area", 0) for d in json.loads(self.txt) 
                  if isinstance(d, dict)))

输出:

In [8]: e = Area('[1, 2, 3, {"area": 123, "weight": 1000}]')

In [9]: print e
123
In [10]: e = Area('["Hello", "World", {"area": 999}, {"area": 1}]') 

In [11]: print e
1000

在您自己的代码中,您正在迭代字符串中的字符,因为您从未调用loads,因此当您比较" area"时,if a == 'area':将永远不会为True。对于每个单独的char,因为self.txt[a]}是无效的语法,因此您的代码也会出错。

答案 1 :(得分:0)

这很有效。

然后你应该测试列表中的每个元素以查看它是否包含项area,你应该记住,列表中的所有项都不会支持in运算符,所以包装它在异常块中。

最后,你在__str__方法中做这一切似乎很奇怪。拥有一个返回

的方法可能会更好
import json

class Area:
def __init__(self, txt):
    self.txt = json.loads(txt)

def __str__(self):
    sum = 0
    for a in self.txt:
        try:
            if 'area' in a:
                sum += int(a['area'])
        except TypeError:
            pass
    return str(sum)


print Area('[1, 2, 3, {"area": 123, "weight": 1000}]')
print Area('["Hello", "World", {"area": 999}, {"area": 1}]')