【问题标题】:python's json: AttributeError: 'str' object has no attribute 'keys'python的json:AttributeError:'str'对象没有属性'keys'
【发布时间】:2019-09-30 22:59:29
【问题描述】:

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

我需要将字符串行转换为 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 格式不符合要求,单引号应该是双引号?鉴于我有大量数据,我不能简单地使用简单的搜索/替换将单冒号替换为双冒号,因为单冒号可能包含在我不应该修改的值中。如果这是问题的原因,有没有办法只替换键/值对的冒号而不触及值中的冒号?我希望这不是问题。

【问题讨论】:

  • 这条线是干什么用的:mystring = json.dumps(mystring)?此外,您的字符串不是有效的 JSON(单引号而不是双引号)。
  • mystring 是从哪里来的?看起来您使用了一个非常好的字典并将其转换为字符串。正确的做法很可能不是添加更多的处理步骤,而是删除更早的错误步骤。
  • 如果你真的被这个字符串卡住了,你可能不得不使用像ast.literal_eval这样的东西或者一个允许的JSON解析器。 json.dumps 绝对不会成为正确解决方案的一部分。
  • mystring 不是有效的 JSON 开头 - 它需要双引号才能成为 json。
  • 您将 Python str 对象序列化为 JSON 字符串对象。所以当你反序列化它时,它将是一个字符串。正如其他人所指出的那样,您的字符串实际上并不包含有效的 JSON,但无论如何,您几乎肯定不是首先要 json.dumps(mystring)这没有任何意义.

标签: python json python-3.x dictionary


【解决方案1】:

与其处理单引号字符串并努力将其转换为json,只需使用ast 包将其转换为有效的dict。

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

【讨论】:

    【解决方案2】:

    此代码将字符串作为字典存储在名为“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))
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 您确定mystring.replace 将仅替换键/值逗号吗?值中没有其他逗号?
      • replace 命令用双引号代替单引号,而不是逗号。您只能打印替换命令的结果,看看它是如何工作的
      • 是的,我的意思是引号。那是一个错字。但正如我所说,值中的数据可能包含双引号。盲目替换引号是很危险的。除非有一种方法可以保证只有键/值引号被替换。
      • 哦,我明白你的担心了...... ast.literal_eval 在这种特殊情况下是一个更实用的解决方案
      • 我的意思是在值内部,有可能我应该保留单引号。示例:'Date': 'Fri, '19' Apr 2019 03:58:04 GMT'。我不应该更改 19 中的引号。或者可能会有双引号,例如:'Date': 'Fri, "19" Apr 2019 03:58:04 GMT',如果我将单引号转换为双引号,我不知道是否会导致问题?
      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 2023-03-09
      • 2017-09-29
      • 2013-12-28
      • 2021-07-26
      • 2017-06-04
      • 2013-10-28
      相关资源
      最近更新 更多