Обработка экранированных строк URL в JSON с использованием Python
Я получаю доступ к сервису, который возвращает json следующим образом:
{
"A":"A value",
"B":{
"B1":"B1 value",
"B2":"B2 value"
},
"C":{
"c_url":"http:\/\/someurl:someport\/somefolder\/somefile",
}
}
Я хочу проанализировать этот json и получить URL-адрес и часть папки somefile в паре ключ-значение.
Итак, по сути, после того, как мой скрипт завершит обработку json, он выведет url и somefile некоторым разделенным способом в файл.
Вывод после того, как файл обработал вышеуказанный json, будет:
url: http://someurl:someport/somefolder/somefile
file: somefile
Я почти уверен, что в python есть множество парсеров json, которые будут анализировать json, но как мне поступить со строкой URL, предварительно обработанной с помощью escape-символов? Нужно ли мне писать свой собственный url-кодировщик, который удалит escape-символы из строки url?
Кроме того, мне нужно было бы токенизировать отдельные компоненты URL, чтобы перейти к части "файл", есть ли библиотеки, которые могут помочь с этим?
Спасибо
2 ответа
В вашем примере JSON не нужна запятая после пары "c_url" kv.
>>> import json
>>> st = '{"A":"A value","B":{ "B1":"B1 value", "B2":"B2 value" },"C":{ "c
_url":"http:\/\/someurl:someport\/somefolder\/somefile" }}'
>>> json.loads(st)
{u'A': u'A value', u'C': {u'c_url': u'http://someurl:someport/somefolder/somefile'}, u'B': {u'B1': u
'B1 value', u'B2': u'B2 value'}}
И чтобы получить только часть файла somefile:
url.split('/')[url.count('/')]
Итак, согласно http://www.quora.com/Why-does-the-cjson-Python-module-not-correctly-unescape-reverse-solidus-solidus
simplejson
должен быть в состоянии справиться с этим "ошибочным" алгоритмом побега. Рассматривать:
#!/usr/bin/env python
import simplejson
print simplejson.loads('"http:\/\/someurl:someport\/somefolder\/somefile"')
Обратите внимание, что simplejson
не является стандартным пакетом, но устанавливается через easy_install
,
Образец вывода:
[85][23:35:24] vlazarenko@alluminium (~/tests) > python unescape.py
http://someurl:someport/somefolder/somefile