【问题标题】:convert string representation of a dict inside json dict value to dict将 json dict 值中的 dict 的字符串表示形式转换为 dict
【发布时间】:2018-08-06 11:43:54
【问题描述】:

大家好,如果标题措辞不当,请见谅。我在思考如何解决我遇到的这个问题时遇到了一些麻烦。我本来想简单地传递一个 dict 作为我的 json obj 中这个键的值,但遗憾的是我必须将它作为一个字符串传递。所以,我有一个 json dict 对象,看起来像这样

data = {"test": "Fuzz", "options": "'{'size':'Regular','connection':'unconnected'}'"}。显然,我希望第二个 dict 值不是字典的字符串表示,而是字典。最好的方法是去掉 data[options] 的倒数第二个和倒数第二个单引号,还是有更好的选择?

如有任何混淆,我们深表歉意。这就是我执行后 json 对象的样子

json.dump(data, <filename>)

options 的值可以看作是另一个变量,比如 x,它等价于 '{'size':'Regular','connection':'unconnected'}'

我可以做 x[1:-1] 但我不确定这是否是这里最 Pythonic 的方式。

【问题讨论】:

  • 你能否展示一些关于你如何获取数据的代码
  • 您可以尝试使用ast.literal_eval
  • 只有 os.getenv('options')。我有一个与我显示为 x 的环境变量相同的环境变量。字典的字符串表示形式。
  • @VasilisG。我不相信这会起作用,因为我使用的是所有单引号。我得到一个无效的语法错误
  • 试试data["options"] = ast.literal_eval(data["options"][1:-1])。在这一点上,我没有看到任何其他方式。

标签: python json dictionary


【解决方案1】:
import ast

bad_string_dict = "'{'size':'Regular','connection':'unconnected'}'"
good_string_dict = bad_string_dict.strip("'")
good_dict = ast.literal_eval(good_string_dict)
print(good_dict)

你必须去掉引号,别无他法

【讨论】:

  • 我认为 strip() 删除了您传递给它的任何字符的所有实例?为什么 dict 键和值周围的单引号没有被删除?
  • @UCProgrammer strip() returns a copy of the string in which all chars have been stripped from the beginning and the end of the string
  • 谢谢。我不知道为什么,但我的大脑完全忘记了 strips() 目的的那一部分。我在这里tutorialspoint.com/python/string_strip.htm 看着它,并认为它是所有字符。
【解决方案2】:

鉴于 OP 的 cmets,我建议如下:

  1. 将环境变量设置为已知的数据格式(例如:json/yaml/...),而不是特定语言 (python)
  2. 使用json 模块(或您选择的格式)加载数据

数据应如下所示:

raw_data = {"test": "Fuzz", "options": "{\"size\": \"Regular\", \"connection\": \"unconnected\"}"}

代码应该是这样的:

raw_options = raw_data['options']
options = json.loads(raw_options)
data = {**raw_data, 'options': options}

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2018-10-14
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多