尝试使用python 3加载JSON对象时出错

Chr*_*isJ 0 python json

我有以下要使用python 3解析的json对象:

customerData = {   
 "Joe": {"visits": 1},  
 "Carol":  {"visits": 2},  
 "Howard": {"visits": 3},  
 "Carrie": {"visits": 4}  
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下python代码来解析对象:

import json 

def greetCustomer(customerData):
    response = json.loads(customerData)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

TypeError:JSON对象必须是str,bytes或bytearray,而不是'dict'

ted*_*ted 12

您似乎误解了加载和转储。

json.loads将字符串转换为python对象,json.load将json文件转换为python对象,json.dumps将python对象转换为字符串并将json.dumpjson字符串从python对象写入文件

提示:注意loads并在末尾dumps有一个s,如字符串


che*_*ner 7

customerData = {   
 "Joe": {"visits": 1},  
 "Carol":  {"visits": 2},  
 "Howard": {"visits": 3},  
 "Carrie": {"visits": 4}  
}
Run Code Online (Sandbox Code Playgroud)

是定义字典的Python代码。如果你有

customerJSON = """{   
 "Joe": {"visits": 1},  
 "Carol":  {"visits": 2},  
 "Howard": {"visits": 3},  
 "Carrie": {"visits": 4}  
}"""
Run Code Online (Sandbox Code Playgroud)

您将拥有一个包含要解析的JSON对象的字符串。(是的,Python语法和JSON语法之间有很多重叠之处。

assert customerData == json.loads(customerJSON)
Run Code Online (Sandbox Code Playgroud)

会过去的。)


但是请注意,并非所有有效的Python都类似于有效的JSON。

这是三个编码相同对象的不同JSON字符串:

json_strs = [
 "{'foo': 'bar'}",  # invalid JSON, uses single quotes
 '{"foo": "bar"}',  # valid JSON, uses double quotes
 '{foo: "bar"}'     # valid JSON, quotes around key can be omitted
]
Run Code Online (Sandbox Code Playgroud)

您可以观察到这all(json.loads(x) == {'foo': 'bar'} for x in json_strs)是真的,因为所有三个字符串都编码相同的Python字典。

相反,我们可以定义三个Python字典,其中前两个是相同的。

json_str = json_strs[0]  # Just to pick one
foo = ...  # Some value
dicts = [
  {'foo': 'bar'},     # valid Python dict
  {"foo": "bar"},     # valid Python dict
  {foo: "bar"}        # valid Python dict *if* foo is a hashable value
                      # and not necessarily 
]
Run Code Online (Sandbox Code Playgroud)

的确是这样dicts[0] == dicts[1] == json.loads(json_str)。但是, dicts[2] == json.loads(json_str)仅当时为真foo == "foo"