需要JSON转储才能给我一个没有单引号的字符串

时间:2018-03-21 23:52:56

标签: python json python-3.x

问题不同,是关于预期输出处理json的方式。抱歉浪费你的时间。

我有一个python字典对象,我试图以字符串格式返回,以便另一个函数进行字符串比较。我无法控制其他功能,所以我有责任以所要求的格式返回。

现在我有了这个 返回的myfunction(params)(json.dump(字典对象))

'{"Engineering": {"employees": 3, "employees_with_outside_friends": 2}, "HR": {"employees": 1, "employees_with_outside_friends": 1}, "Business": {"employees": 1, "employees_with_outside_friends": 1}, "Directors": {"employees": 1, "employees_with_outside_friends": 0}}'

但是我希望返回看起来像常规字符串,当我运行print(dict)时会打印出来

{"Engineering": {"employees": 3, "employees_with_outside_friends": 2}, "HR": {"employees": 1, "employees_with_outside_friends": 1}, "Business": {"employees": 1, "employees_with_outside_friends": 1}, "Directors": {"employees": 1, "employees_with_outside_friends": 0}}

示例代码:

def get_actual_output():
    dict_ = dict({"Engineering": {"employees": 3, "employees_with_outside_friends": 2},"HR": {"employees": 1, "employees_with_outside_friends": 1},"Business": {"employees": 1, "employees_with_outside_friends": 1},"Directors": {"employees": 1, "employees_with_outside_friends": 0}})
    return(json.dumps(dict_))

expected_output = '{"Engineering": {"employees": 3, "employees_with_outside_friends": 2},"HR": {"employees": 1, "employees_with_outside_friends": 1},"Business": {"employees": 1, "employees_with_outside_friends": 1},"Directors": {"employees": 1, "employees_with_outside_friends": 0}}'

get_actual_output() == expected_output returns False

添加更多细节:

当我打印上述函数的返回值和期望值时,这就是我得到的:

>>> actual_output
'{"Business": {"employees": 1, "employees_with_outside_friends": 1}, "Dir
ectors": {"employees": 1, "employees_with_outside_friends": 0}, "Engineer
ing": {"employees": 3, "employees_with_outside_friends": 2}, "HR": {"empl
oyees": 1, "employees_with_outside_friends": 1}}'

>>> test['expected_output']
{'Business': {'employees': 1, 'employees_with_outside_friends': 1},
 'Directors': {'employees': 1, 'employees_with_outside_friends': 0},
 'Engineering': {'employees': 3, 'employees_with_outside_friends': 2},
 'HR': {'employees': 1, 'employees_with_outside_friends': 1}}

2 个答案:

答案 0 :(得分:1)

您与get_actual_output() == expected_output的示例不匹配只是因为您在某些键之前缺少空格。例如:...s": 2},"HR": {"em...,其中实际输出为...s": 2}, "HR": {"em...。你不能从json.dumps获得你想要的格式,因为你在某些键之前有空格,而不是其他键。

您可以使用json.dumps(..., separators=(',', ': '))删除所有空格,但这可能会让情况更加混乱。

理想情况下,您应该解析字符串响应并进行比较。这样,您还可以避免无法保证元素顺序的问题。

答案 1 :(得分:0)

Json与python字典表示不同,当你打印字典时,python没有使用json语法来生成字典的字符串表示,dict对象有自己的__str__实现,在调用str或者调用str时调用做一个打印(在对象上调用str)。

str(dict_)生成一个由__str__生成的字符串,并且不遵循json语法,它类似,但不相同,这是两种不同的语法。

此外,json只允许双引号用于字符串,而python允许双引号和单引号。

对json进行简单处理使其看起来像dict的python repr(比如删除/替换引号..)是一个坏主意,在处理复杂对象表示甚至浮动时会遇到问题。

如果你想要一个看起来像是通过打印dict生成的字符串的字符串,请使用str(dict_)。