2012-09-07 4 views
3

로그인이 필요한 URL에서 json을 구문 분석하려고 시도했습니다. 여기에 모든 코드를 포함 시키면 어디에서 오류인지 알 수 없습니다.Python에서 JSON을 구문 분석하는 동안 다양한 오류가 발생했습니다.

Traceback (most recent call last): 
    File "jsontest.py", line 23, in <module> 
    json_object = json.loads(request) 
    File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 413, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 402, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
TypeError: expected string or buffer 

내 샘플 JSON : 나는 옵션 2를 실행하면

Traceback (most recent call last): 
    File "jsontest.py", line 22, in <module> 
    json_object = json.loads(str(request)) 
    File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 413, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 402, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 420, in raw_decode 
    raise JSONDecodeError("No JSON object could be decoded", s, idx) 
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0) 

: 내가 옵션 1의 코드를 실행하면

try: import simplejson as json 
except ImportError: import json 
import urllib2 

username = 'user' 
password = '1234' 
url = "https://www.blah.com/someplace" 

# set up the username/password/url request 
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
password_mgr.add_password(None, "https://www.blah.com", username, password) 
handler = urllib2.HTTPBasicAuthHandler(password_mgr) 
opener = urllib2.build_opener(handler) 
urllib2.install_opener(opener) 
request = urllib2.Request(url) 
response = opener.open(request) 

# option 1 
json_object = json.loads(str(response)) 

#option 2 
json_object = json.loads(response) 

(옵션 2 주석),이 오류가 발생합니다 내가 말할 수있는 한 유효합니다.

{"set1":[{"data1":"411","data2":"2033","data3":"1","data4":"43968077","data5":"217","data6":"106828","data7":[]}], "set2":{"data8":"411","data9":"2033","data10":"43968077","data11":"217223360","data12":"106828"}}

implejson version = 2.3.2, 파이썬 2.7.3

매우 새로운 것이므로 모든 포인터가 매우 유용 할 것입니다. 당신은 JSON 라이브러리를 가지고 .load()을 사용하여 직접 읽을 수 있도록

json_object = json.load(response) 

응답은, 파일 - 류의 객체입니다

+1

왜 요청 개체를 읽으려고합니까? 응답을 원하지 않니? response = opener.open (req); data = response.read() – monkut

+1

'json_object = json.loads (response)'를 의미하지 않습니까? ('요청'이 아닐까요?) 그냥 오타입니까? –

+0

어. 예, 나는 응답을 의미했습니다. 편집 됨. – acpigeon

답변

8

당신은 응답이 아닌 요청을 디코딩 할 수 있습니다.

: 파이썬 2.7이 이미 json로 이름을 바꾼 simplejson 라이브러리를 포함

json_object = json.loads(response.read()) 

참고 :

는 다른 방법으로 (일부 임시 메모리 사용의 비용으로) 완전히 읽을 응답으로 .loads() 기능을 사용

import json 
+0

맞습니다. .read() 또는 load()를 사용해야했습니다. '응답'은 오타였습니다. 나는 이제 준비가되어있는 py dict를 가지고있다, 고마워! – acpigeon

1

요청 (오타 일 수도 있음)이 아닌 응답을 사용해야하지만 HTTP 응답의 본문을 가져 오려면 response.read()을 사용해야합니다.

json_object = json.loads(response.read()) 
관련 문제