如何处理不正确的json格式? (simplejson.scanner.JSONDecodeError:期望值:第1行第1列(char 0))

时间:2016-10-31 19:30:17

标签: python json python-2.7

1)几天前我工作了几周的剧本破了。我现在无法正确解析JSON。所以这不是净新代码,它已经运行了几个月。

2)服务网站发生了一些变化,它使JSON不合规,但我一直试图绕过这个问题但没有成功。我认为它可能是一个额外的空间或东西,但我不能改变从服务网站返回的信息。

3)我知道json不合规,因为我使用了验证器(https://jsonformatter.curiousconcept.com/),通过将我需要的服务的URL与我需要的凭据/格式放在一起,我得到了正确的结果,但验证失败了“编码无效,期望UTF-8,UTF-16或UTF-32。[代码29,结构0]”。有一种方法可以告诉验证器不要验证并且Json看起来正确,但Python不会与它有任何关系。当我运行我的脚本时,它会报告: simplejson.scanner.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响应。一个例子(混淆): { “用户ID”:0, “SecurityToken”: “abcdb8c3-1ef1-1110-1234-402a914f52aa”, “响应码”: “0”, “的ErrorMessage”: “”, “BrandId”:2 “名优产品”:“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 个答案:

答案 0 :(得分:0)

我找到了解决方案并希望分享。

所以我非常困惑的是,我可以在网络浏览器中打开服务URL并获得一些json,但我无法在我的脚本中执行此操作,甚至只使用cURL。即使请求从浏览器起作用,我仍然继续“请求被拒绝”,所以它必须是其他东西。

所以我开始尝试并在我的脚本中发送请求用户代理信息并发消息!下面的代码工作,虽然我模糊了原始的URL和我的保护凭据。

我还想解释一下,我正在这样做,因为服务URL提供了一次性令牌,我可以用它来触发另一个动作。所以我需要这个例程和执行,因为我需要进行多次特定的操作,所以我想要的是从json表单中检索令牌。希望现在使用下面的代码更有意义。

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