2

我有以下 Python 代码块:

data = json.loads(line)
if data.has_key('derivedFrom'):
     dFin = data['derivedFrom']
     if dFin.has_key('derivedIds'):

这曾经在这样的 JSON 块上正常工作:

"derivedFrom": {"source": "FOO", "model": "BAR", "derivedIds": ["123456"]}

现在格式更改为:

"derivedFrom": "{\"source\": \"FOO.\", \"model\": \"BAR\", \"derivedIds\": [\"123456\"]

因此 Python 块中的最后一行会引发以下异常:

'unicode' object has no attribute 'has_key'

有没有办法预处理 JSON 以has_key再次工作?

4

4 回答 4

10
"{\"source\": \"FOO.\", \"model\": ...

是 JSON 字符串文字中的 JSON 对象。要获得内部 JSON 的属性,您必须再次对其进行解码。

data = json.loads(line)
if 'derivedFrom' in data:
    dFin = json.loads(data['derivedFrom'])
    if 'derivedIds' in dFin:
        ....

JSON-in-JSON 通常是一个错误,因为很少需要它 - 是什么产生了这个输出,它需要修复吗?

于 2012-12-20T22:35:00.100 回答
1

利用:

'derivedIds' in dFin

这适用于字典和 unicode,即使使用 unicode 它可能会产生误报。

更强大的方法可以使用Duck Typing

try:
    dFin = json.loads(data['derivedFrom'])  #assume new format
except TypeError:
    dFin = data['derivedFrom']  #it's already a dict
if 'derivedIds' in dFin: # or dFin.has_key('derivedIds')
    #etc
于 2012-12-20T18:11:59.093 回答
0

如果您希望完全相同的代码块工作,请考虑将您的新格式稍微调整为以下:

"{\"derivedFrom\": {\"source\": \"FOO.\", \"model\": \"BAR\", \"derivedIds\": [\"123456\"]}}"
于 2012-12-20T18:46:09.973 回答
0

您正在将 derivedFrom 属性从 JSON 对象更改为字符串。字符串没有名为 has_key 的属性。

于 2012-12-20T16:11:46.573 回答