Dans le travail réel, vous devez convertir une chaîne Python en un dictionnaire, tel que la chaîne :
user_info = '{"name" : "john", "gender" : "male", "age ": 28}'
Nous voulons le convertir dans le dictionnaire suivant :
user_dict = {"name" : "john", "gender" : "male", "age": 28}
Il existe plusieurs méthodes :
1 Convertir
>>> import json >>> user_info= '{"name" : "john", "gender" : "male", "age": 28}' >>> user_dict = json.loads(user_info) >>> user_dict {u'gender': u'male', u'age': 28, u'name': u'john'}
via json mais utilisez Il y a. un problème potentiel avec la conversion en json.
Étant donné que la syntaxe json stipule que les chaînes dans les tableaux ou les objets doivent utiliser des guillemets doubles, les guillemets simples ne peuvent pas être utilisés (une description sur le site officiel est "Une chaîne est une séquence de zéro ou plusieurs caractères Unicode, entourés de doubles guillemets, en utilisant des barres obliques inverses"), donc la conversion suivante est erronée :
>>> import json >>> user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}" # 由于字符串使用单引号,会导致运行出错 >>> user_dict = json.loads(user_info) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 339, in loads return _default_decoder.decode(s) File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 364, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 380, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Expecting property name: line 1 column 2 (char 1)
2. La conversion via eval
>>> user_info = '{"name" : "john", "gender" : "male", "age": 28}' >>> user_dict = eval(user_info) >>> user_dict {'gender': 'male', 'age': 28, 'name': 'john'} >>> user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}" >>> user_dict = eval(user_info) >>> user_dict {'gender': 'male', 'age': 28, 'name': 'john'}
n'existe pas lors de l'utilisation de json ci-dessus. Problème avec conversion. Cependant, il existe des problèmes de sécurité lors de l'utilisation de eval, comme dans l'exemple suivant :
# 让用户输入 `user_info` >>> user_info = raw_input('input user info: ') # 输入 {"name" : "john", "gender" : "male", "age": 28},没问题 >>> user_dict = eval(user_info) # 输入 __import__('os').system('dir'),user_dict 会列出当前的目录文件! # 再输入一些删除命令,则可以把整个目录清空了! >>> user_dict = eval(user_info)
3 Il n'y a aucune utilisation de ast.literal_eval pour la conversion via literal_eval
>>> import ast >>> user = '{"name" : "john", "gender" : "male", "age": 28}' >>> user_dict = ast.literal_eval(user) >>> user_dict {'gender': 'male', 'age': 28, 'name': 'john'} user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}" >>> user_dict = ast.literal_eval(user) >>> user_dict {'gender': 'male', 'age': 28, 'name': 'john'}
. json, il n'y a aucun problème de sécurité avec la conversion eval, il est donc recommandé d'utiliser ast.literal_eval.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!