2014-07-04 3 views
2

실제로이 웹 사이트 인 "android-review.googlesource.com"에서 "httplib.HTTPSConnection"에 연결하려고합니다.이 도구는 실제로 Gerrit입니다. 코드 검토)에서 Gerrit API는 JSON 형식의 검토 데이터에 대한 인터페이스를 제공합니다. JSON 데이터를 수집해야합니다. Gerrit에 대한 자세한 내용은 여기를 참조하십시오. https://gerritreview.googlesource.com/Documentation/rest-api.htmlTypeError : <내장 함수 ID>가 JSON을 직렬화 할 수 없습니다.

소스 코드에 대해 조금 설명하겠습니다. 캐시 사용을 위해 파일에 데이터를 저장하는 "GetRequestOrCached"기능과 웹 사이트에 대한 연결을 생성하고 응답을 반환하는 "MakeRequest"기능이 있습니다. 하지만 오류는 json.dumps가 요청 (req)에 사용되는 부분과 관련이 있습니다. 요청은 사전입니다.

import socket, sys 
import httplib 
import pyodbc 
import json 
import types 
import datetime 
import urllib2 
import os 
import logging 
import re, time 

def GetRequestOrCached(url, method, data, filename): 

    path = os.path.join("json", filename) 
    if not os.path.exists(path): 
    data = MakeRequest(url, method, data) 
    time.sleep(1) 
    data = data.replace(")]}'", "") 
    f = open(path, "w") 
    f.write(data) 
    f.close() 
    return open(path).read() 

def MakeRequest(url, method, data, port=443): 
    successful = False 
    while not successful: 
    try: 
     conn = httplib.HTTPSConnection("android-review.googlesource.com", port) 
     headers = {"Accept": "application/json,application/jsonrequest", 
     "Content-Type": "application/json; charset=UTF-8", 
     "Content-Length": len(data)} 
     conn.request(method, url, data, headers) 
     conn.set_debuglevel(1) 
     successful = True 
    except socket.error as err: 
     # this means a socket timeout 
     if err.errno != 10060: 
     raise(err) 
     else: 
     print err.errno, str(err) 
     print "sleep for 1 minute before retrying" 
     time.sleep(60) 

    resp = conn.getresponse() 
    if resp.status != 200: 
    raise GerritDataException("Got status code %d for request to %s" % (resp.status, url)) 
    return resp.read() 
#------------------------------------------------- 
filename = "%d-ChangeDetails.json" 
url = "/gerrit_ui/rpc/ChangeDetailService" 
req = {"jsonrpc" : "2.0", 
    "method": "changeDetail", 
    "params": [{"id": id}], 
    "id": 44 
     } 
data = GetRequestOrCached(url, "POST", json.dumps(req), filename) 
print json.loads(data) 

이 광고 오류 "데이터 = GetRequestOrCached (URL"POST "json.dumps 발생 (REQ)

TypeError: <built-in function id> is not JSON serializable 

이것은 코드 :

오류이며 , 파일 이름)". 오류를 수정 한 사람도 웹 사이트의 응답이 오류인지 또는 올바른 응답인지 확인합니다.

+0

죄송합니다 그 가치? –

답변

4

오류 메시지가 모든 것을 말해 - 당신이 당신의 req 사전 내부 id 기능을 가지고 : 당신이 오류가 발생하는 이유는, 그래서

req = {"jsonrpc" : "2.0", 
    "method": "changeDetail", 
    "params": [{"id": id}], 
#     ^- here 
    "id": 44 
} 

기능이 직렬화 JSON되지 않습니다.

대신 변수를 전달하려는 경우 변수를 사용하기 전에 초기화하지 않았습니다. 이러한 종류의 문제를 피하려면 내장 이름을 변수 이름 (예 : id, int ...)으로 사용하지 마십시오.

1

req에 할당 할 때 사용하기 전에 id 변수에 할당하는 것을 잊어 버린 것 같습니다.

할당하지 않았기 때문에 id이라는 기본 제공 함수가 선택되어 전달되어 jsonized가됩니다. 함수이기 때문에 jsonized 될 수 없습니다. 같은이 내장 될 일이없는 이름이 일어난 경우

은, 당신이 가지고 것 :

이 바보 같은 질문이지만, 변수가`어디서 id` 않을 경우
UnboundLocalError: local variable referenced before assignment