В нашей работе мы часто сталкиваемся с проблемой взаимного преобразования между типами данных, и обычно мы запрашиваем какие-то отговорки API, чтобы вернуть строку, но формат Json, и проще всего преобразовать ее в словарь на Python, поэтому Вот три способа преобразования строк в словари в Python.
Способ 1: Через встроенную функциюeval
Source Code:
#!/usr/bin/env python3
#Author: nock.chen
str_info = "{'name': 'nock', 'age': 14}"
dict_info = eval(str_info)
print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))
Result:
string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>
Однако при использовании eval возникает проблема безопасности, например:
Source Code:
#!/usr/bin/env python3
#Author: nock.chen
str_info = input('input str info: ')
dict_info = eval(str_info)
print("dict_info is >%s< " % dict_info)
Result:
input str info: __import__('os').system('ls')
collector_data.py
test.py
Download
dict_info is >0<
Как показано выше, когда мы вводим__import__('os').system('ls')
распечатает файлы в каталоге, где хранится скрипт, если вы передадитеrm -rf *
Команды, подобные этой, удалят все вещи в измененном каталоге; конечно, сценарии, которые мы используем, будут очень хорошими и немногочисленными, и невозможно, чтобы кто-то передал такое значение, но вот объяснение.
Способ 2: пройтиjson
обработка модулей
Source Code:
#!/usr/bin/env python3
#Author: nock.chen
import json
str_info = '{"name": "nock", "age": 18}'
dict_info = json.loads(str_info)
print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))
Result:
string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>
использоватьjson
Модуль конвертации тоже проблема, т.к.json
Синтаксис предусматривает, что строки в массиве или объекте должны заключаться в двойные, а не в одинарные кавычки.Официальный сайтВыше есть описание:
#!/usr/bin/env python3
#Author: nock.chen
import json
str_info = "{'name': 'nock', 'age': 18}"
dict_info = json.loads(str_info)
сообщить об ошибкеРезультаты приведены ниже:
Traceback (most recent call last):
File "test.py", line 7, in <module>
dict_info = json.loads(str_info)
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Метод 3: пройтиast
обработка модулей
Source Code:
#!/usr/bin/env python3
#Author: nock.chen
import ast
str_info = '{"name": "nock", "age": 18}'
dict_info = ast.literal_eval(str_info)
print("string info type is -->: %s" % (type(str_info)))
print("dict info type is -->: %s" % (type(dict_info)))
s_info = "{'name': 'nock', 'age': 18}"
d_info = ast.literal_eval(s_info)
print("s info type is -->: %s" % (type(s_info)))
print("d info type is -->: %s" % (type(d_info)))
Result:
string info type is -->: <class 'str'>
dict info type is -->: <class 'dict'>
s info type is -->: <class 'str'>
d info type is -->: <class 'dict'>
использоватьast.literal_eval
Для преобразования ни один из них не используетсяjson
Проблема конвертации модуля, толку нетeval
Проблема безопасности преобразования модулей, поэтому рекомендуется использоватьast.literal_eval
Методы.