字符串如何转为字典格式

字符串中的key带有引号,怎么转换为字典格式?

1、通过 json 来转换

  1. >>> import json
  2. >>> user_info= '{"name" : "john", "gender" : "male", "age": 28}'
  3. >>> user_dict = json.loads(user_info)
  4. >>> user_dict
  5. {u'gender': u'male', u'age': 28, u'name': u'john'}

但是使用 json 进行转换存在一个潜在的问题:数组或对象之中的字符串必须使用双引号,不能使用单引号

2、通过 eval

  1. >>> user_info = '{"name" : "john", "gender" : "male", "age": 28}'
  2. >>> user_dict = eval(user_info)
  3. >>> user_dict
  4. {'gender': 'male', 'age': 28, 'name': 'john'}
  5. >>> user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
  6. >>> user_dict = eval(user_info)
  7. >>> user_dict
  8. {'gender': 'male', 'age': 28, 'name': 'john'}

通过 eval 进行转换就不存在上面使用 json 进行转换的问题。但是,使用 eval 却存在安全性的问题

3、通过 literal_eval

  1. >>> import ast
  2. >>> user = '{"name" : "john", "gender" : "male", "age": 28}'
  3. >>> user_dict = ast.literal_eval(user)
  4. >>> user_dict
  5. {'gender': 'male', 'age': 28, 'name': 'john'}
  6. user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
  7. >>> user_dict = ast.literal_eval(user)
  8. >>> user_dict
  9. {'gender': 'male', 'age': 28, 'name': 'john'}

使用 ast.literal_eval 进行转换既不存在使用 json 进行转换的问题,也不存在使用 eval 进行转换的 安全性问题,因此推荐使用 ast.literal_eval

如果字符串中的key没有引号怎么转换为字典:

1)使用yaml

  1. import yaml
  2. content="{a: 1, b: djhdj, c: [d: 34]}"
  3. yaml.safe_load(content)

2)使用demjson

  1. import demjson
  2. content="{a: 1, b: djhdj, c: [d: 34]}"
  3. dict = demjson.decode(content)

3)使用函数直接变为字典

  1. def jsonfy(s: str) -> object:
  2. obj = eval(s, type('js', (dict,), dict(__getitem__=lambda s, n: n))())
  3. return obj