Как бороться с неправильным форматом json ? (simplejson.сканер.JSONDecodeError: ожидаемое значение: строка 1 столбец 1 (char 0))

1) сценарий, который я работал в течение многих недель, сломался несколько дней назад. Я не могу разобрать JSON должным образом сейчас. Так что это не чистый новый код, это то, что работает в течение нескольких месяцев.

2) что-то изменилось в сервисном веб-сайте, и это делает JSON несоответствующим, но я пытался обойти эту проблему без успеха. Я думаю, что это может быть дополнительное пространство или что-то, но я не могу изменить информацию, возвращенную с веб-сайта обслуживания.

3) я знаю, что json не соответствует, потому что я использовал валидатор ( https://jsonformatter.curiousconcept.com/) путем класть URL обслуживания мне с моими необходимыми учетными данными/форматом, и я получаю правильные результаты но проверка терпит неудачу с «инвалидным зашифрованием, ожидая UTF-8, UTF-16 или UTF-32.[Код 29, Структура 0]». Есть способ сказать валидатору не проверять и Json выглядит правильным, но Python не будет иметь с этим ничего общего. При запуске скрипта он сообщает:
simplejson.сканер.JSONDecodeError: ожидаемое значение: строка 1 столбец 1 (char 0).

4) ниже Моя запись URL вручную и скрипт. Я запутал всю конфиденциальную и личную информацию, поэтому URL-адрес, если вы попытаетесь, не будет работать, но когда я делаю не запутанный формат, я получаю ответ JSON.

5) ручной URL (запутанный):
https://mystuff.mydevices.com/Membership/SomeOtherURLrelated?appId=BB8pQgg123450WHahgl12345nAkkX67890q2HrHD7H1nabcde5KqtN654321LB%2fi&securityToken=null&username=myemail@somedomain.com&password=mypassword&culture=en

6) Если я вручную открыл браузер и поставил предыдущий реальный URL (немодифицированный), браузер отвечает json. Пример (запутанный):
{«UserId»:0,»SecurityToken»:»abcdb8c3-1ef1-1110-1234-402a914f52aa»,»ReturnCode»:»0″,»ErrorMessage»:»»,»BrandId»:2,»BrandName»:»Mydevicebrandname»,»RegionId»:1}

7) что я могу сделать, чтобы преодолеть это ? есть предложения ? Я читал и тестирования, но не повезло!

8) Теперь сценарий (запутанный), который в основном строит предыдущий URL и извлекает из JSON одноразовый маркер безопасности, который затем я могу использовать для других целей в гораздо большем приложении:

import json,requests


APPID    = 'BB8pQgg123450WHahgl12345nAkkX67890q2HrHD7H1nabcde5KqtN654321LB%2fi'
USERNAME = 'myemail@somedomain.com'
PASSWORD = 'mypassword'
CULTURE  = 'en'
SERVICE  = 'https://mystuff.mydevices.com'

def get_token_formydevices():   
    payload = {'appId': APPID,
               'securityToken': 'null',
               'username': USERNAME,
               'password': PASSWORD,
               'culture': CULTURE,}
    login_url = SERVICE + '/Membership/SomeOtherURLrelated'
    try:
        r = requests.get(login_url, params=payload)
    except requests.exceptions.RequestException as err:
        return       

    data = r.json()
    if data['ReturnCode'] != '0':
        print(data['ErrorMessage'])
        sys.exit(1)
    return data['SecurityToken']

tokenneeded = get_token_formydevices()

print tokenneeded

9) Когда я запускаю предыдущий код, это то, что я получаю обратно:

Traceback (most recent call last):
  File "testtoken.py", line 33, in <module>
    tokenneeded = get_token_formydevices()
  File "testtoken.py", line 26, in get_token_formydevices
    data = r.json()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 826, in json
    return complexjson.loads(self.text, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/simplejson/__init__.py", line 516, in loads
    return _default_decoder.decode(s)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

1 ответ

  1. Я нашел решение и хочу поделиться.

    Поэтому я был очень озадачен тем фактом, что я мог открыть обслуживающий URL в веб-браузере и получить некоторый json обратно, но я не мог сделать это в моем сценарии или даже просто с помощью cURL. Я продолжал получать «запрос отказано», хотя запрос работал из браузера, так что это должно было быть что-то еще.

    Поэтому я начал экспериментировать и отправлять информацию о запросе Агента пользователя в своем скрипте и voilá! код ниже работает, хотя я запутал исходный URL и мои учетные данные для защиты.

    Я также хочу объяснить, что я делал это, поскольку обслуживающий URL-адрес предоставляет назад одноразовый маркер, который я могу использовать для запуска другого действия. Поэтому мне нужна была эта процедура и руководитель столько раз, сколько нужно для выполнения конкретных действий, поэтому все, что я хотел, это получить маркер из формы json, что url. Надеюсь, это имеет больше смысла теперь с кодом ниже.

    import json,urllib2
    url='https://mystuff.mydevices.com/Membership/SomeOtherURLrelated?appId=BB8pQgg123450WHahgl12345nAkkX67890q2HrHD7H1nabcde5KqtN654321LB%2fi&securityToken=null&username=myemail@somedomain.com&password=mypassword&culture=en'
    request = urllib2.Request(url)
    #request.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36')   # <--- this works too
    request.add_header('User-Agent', 'Mozilla/5.0')
    data = json.loads(str(urllib2.urlopen(request).read()))
    token = data["SecurityToken"]
    print token