python的json:AttributeError:“ str”对象没有属性“ keys”

时间:2019-05-14 00:43:31

标签: python json python-3.x dictionary

我正在尝试加载格式化为字典的字符串(实际程序从文件中读取此行,并且这是一个我无法手动修改的非常大的文件)。

我需要将字符串行转换为json对象,以便可以检查特定键的值,例如myJson[Date]

这是脚本:

import json

mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}"


mystring = json.dumps(mystring)
myJson = json.loads(mystring)

print(str(myJson.keys()))
print(str(myJson))

我收到此错误:

AttributeError: 'str' object has no attribute 'keys'

我怀疑mystring格式不符合要求,单引号应该是双引号吗?鉴于我拥有大量数据,我不能使用简单的搜索/替换简单地用双冒号替换单个冒号,因为单个冒号可能包含在我不应该修改的值中。如果这是导致问题的原因,是否有任何方法可以仅替换键/值对中的冒号而不触摸值中的冒号?我希望这不是问题。

3 个答案:

答案 0 :(得分:1)

使用ast包将其转换为有效的字典,而不是处理单引号字符串并努力将其转换为json。

import ast

mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}"

my_dict = ast.literal_eval(mystring)

结果是:

> print(my_dict["Date"])
Fri, 19 Apr 2019 03:58:04 GMT

答案 1 :(得分:0)

此代码将字符串作为字典存储在名为“ Tempvar”的变量中 从该变量中,您可以像常规字典一样使用键。

import json

mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}"

exec("tempvar = " + mystring)
mystring = json.dumps(mystring)
myJson = json.loads(mystring)

print(str(tempvar['Date']))
print(str(myJson))

希望这会有所帮助

答案 2 :(得分:-1)

是的,json解码器喜欢键和值的双引号,而且我认为您可以使用python进行替换,请尝试是否适用:

mystring = "{'Date': 'Fri, 19 Apr 2019 03:58:04 GMT', 'Server': 'Apache/2.4.39', 'Accept-Ranges': 'bytes'}"
json_string = mystring.replace("'", "\"")
d = json.loads(json_string)

dstring = json.dumps(d)
myJson = json.loads(dstring)

print(str(myJson.keys()))