JSON т.е. JavaScript Object Notaion
не поддерживает включение одинарных кавычек '
вокруг строк и (
или )
списков / массивов arounf при использовании json.loads()
для преобразования строкового представления в объект (словарь).
Использование json.dumps()
нормально с кортежами / списками, одинарными / двойными кавычками и т. Д., Поскольку Python внутренне преобразует их в правильный допустимый JSON.Значит, он преобразует (
)
, используемый для представления / окружения кортежей, в [
]
и '
, используемый для представления / окружения строк, в "
.
Мое предложениечтобы избавиться от проблем такого рода
При выгрузке / записи данных в файл JSON используйте json.dumps()
для создания строки из существующих объектов Python, таких как список / словарь (конвертируемый JSON).
После этого, если вы будете читать то же самое в любой момент времени позже, оно будет легко преобразовано в реальный список / словарь объектов Python и т. Д. С использованием json.loads()
из строк или с использованием json.load()
из файловоподобных объектов.
Пример, который помог выяснить
>>> import json
>>>
>>> d = {
... 'location1' : ("1.1.1.1/32", [22, 443]),
... 'location2' : ("2.2.2.2/32", [443])}
>>>
>>> s = json.dumps(d, indent=4)
>>> print(s)
{
"location2": [
"2.2.2.2/32",
[
443
]
],
"location1": [
"1.1.1.1/32",
[
22,
443
]
]
}
>>>
>>> new_d = json.loads(s)
>>>
>>> new_d
{u'location2': [u'2.2.2.2/32', [443]], u'location1': [u'1.1.1.1/32', [22, 443]]}
>>>
>>> new_d['location2']
[u'2.2.2.2/32', [443]]
>>>
>>> new_d['location1']
[u'1.1.1.1/32', [22, 443]]
>>>
>>> new_d['location1'][0]
u'1.1.1.1/32'
>>> new_d['location1'][1]
[22, 443]
>>>
>>> new_d['location1'][1][0]
22
>>> new_d['location1'][1][1]
443
>>>
>>> # NEW (start from string)
...
>>> s = '''{
... 'location1' : ("1.1.1.1/32", [22, 443]),
... 'location2' : ("2.2.2.2/32", [443])}'''
>>> print(s)
{
'location1' : ("1.1.1.1/32", [22, 443]),
'location2' : ("2.2.2.2/32", [443])}
>>>
1-я попытка
>>> s = '''{'location1' : ["1.1.1.1/32", [22, 443]],'location2' : ["2.2.2.2/32", [443]]}'''
>>> s
'{\'location1\' : ["1.1.1.1/32", [22, 443]],\'location2\' : ["2.2.2.2/32", [443]]}'
>>>
>>> print(s)
{'location1' : ["1.1.1.1/32", [22, 443]],'location2' : ["2.2.2.2/32", [443]]}
>>>
>>> d = json.loads(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python@2/2.7.15_2/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/2.7.15_2/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/2.7.15_2/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-я попытка
>>>
>>> s = '''{
... "location1" : ("1.1.1.1/32", [22, 443]),
... "location2" : ("2.2.2.2/32", [443])}'''
>>>
>>> d = json.loads(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python@2/2.7.15_2/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/2.7.15_2/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/2.7.15_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
>>>
>>>
Наконец
>>> s = '''{
... "location1" : ["1.1.1.1/32", [22, 443]],
... "location2" : ["2.2.2.2/32", [443]]}'''
>>>
>>> d = json.loads(s)
>>> d
{u'location2': [u'2.2.2.2/32', [443]], u'location1': [u'1.1.1.1/32', [22, 443]]}
>>>
>>> type(d)
<type 'dict'>
>>>
>>> d['location2']
[u'2.2.2.2/32', [443]]
>>>
>>> d['location2'][1][0]
443
>>>