2012-04-05 3 views
11

JS 및 서버 측에서 AJAX 호출을 통해 복합 JSON 구조를 전달하는 방법을 파이썬에서 "매우 비슷한"데이터 구조로 읽으십니까?Django : QueryDict에서 JSON 객체 배열 읽기

나는 json 포맷팅 (simplejson 등)을 사용할 수 있다는 것을 알고 있지만 어떻게 든 QueryDict 자체가 기형이거나 내 경우에 재 포맷 된 것으로 느낀다.

예 :

JSON 오브젝트의 배열을 통과 [{ "ID"1}, { "ID"2}, { "ID"3}] 장고 뷰 AJAX 통해 상기 QueryDict 형식 :

POST:<QueryDict: {u'json_data[0][id]': [u'1'], u'type': [u'clone'], 
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], 
u'json_data[1][id]': [u'2'], u'json_data[2][id]': [u'3']}> 

json_data를 반복하는 방법은 무엇입니까? 나는 사전으로 QueryDict에 액세스하고 특정 순서로 목록 및 프로세스를로 json_data 검색 할 수 있도록

POST:<QueryDict: {u'json_data': [{u'id': [u'1']}, {u'id': [u'2']}, {u'id': [u'3']}]}, 
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], u'type': [u'clone']> 

:

내가 대신 이렇게 뭔가를 얻으려면 어쩌면 그냥 순차적으로 그들을 통해 반복 목록 순서. 뭔가 같은 :

사실
ret = request.POST 
for item in ret['json_data']: 
    process(item['id']) 

과정 (에 들어가는 값)

자바 스크립트 키 값 쌍의 다른 사전 대신 단지 숫자 (1,2,3 등)이 될 수 :

var test = [{"id": 1},{"id": 2},{"id": 3}]; 
$.post(
    "/insert_tc", 
    { 
     json_data: test, 
     "type": 'clone', 
     "csrfmiddlewaretoken": $csrf_token 
    }, 
    function(json) { 
     //CALLBACK 
    }, 
    "json" 
); 

views.py :

def insert_tc(request): 
    if request.method == 'POST':  
    ret = request.POST 
    type = ret['type'] 
    list = ret.getlist(ret) 

그러나 목록이 비어 []

내가 시도 simplejson을 반환은로드, 항목, 방법을 얻을 수 있지만, 그들 중 누구도 도움이되지, 덤프합니다.

jQuery.param (obj, true)도 시도해 보았습니다.하지만 원하는 것은 아닙니다 (어느 정도 가까운 편이지만).

Django < -> JS에서 AJAX를 통해 복합 데이터 구조를 앞뒤로 전달할 수있는 다른 방법이 있습니까?

+0

뭔가 확실히 잘못된 것입니다. 제발 그걸 출력 정확한 코드를 게시 할 수 있습니까? –

+0

JS 코드가 정확할 까봐 두렵습니다. 내가 JS snippet과 작은 크기의 서식으로 views.py의 인쇄 요청 출력을 붙여 넣었다. 'test'는 내가 지나가고있는 객체의 배열입니다. – rajivRaja

+0

죄송합니다, 실수. 아래 내 대답을 참조하십시오. –

답변

12

JSON.stringify()를 사용하여 JSON의 문자열을 지정해야합니다. 이렇게하면 JSON 객체가 문자열 형식으로 변환되어 다른 끝에 올바르게 구문 분석 될 수 있습니다. 다른 끝에서 json.loads()를 사용하여 객체를 "unstringify"해야합니다.

자바 스크립트 :

var test = [{"id": 1},{"id": 2},{"id": 3}]; 
$.post(
    "/insert_tc", 
    { 
     json_data: JSON.stringify(test), 
     "type": 'clone', 
     "csrfmiddlewaretoken": $csrf_token 
    }, 
    function(json) { 
     //CALLBACK 
    }, 
    "json" 
); 

보기 : 게시 된 코드가 확실히 그 QueryDict 결과를 제공하지 않기 때문에

import json 
def insert_tc(request): 
    if request.method == 'POST':  
     ret = request.POST 
     type = ret['type'] 
     list = json.loads(ret['json_data']) 
+0

Thanks! Daniel의 답변이시의 적절하고 장애물을 극복하는 데 정말로 도움이되었지만 JSON.stringify()가 작업을보다 명확하게 처리하므로이 답변을 받아 들여야합니다. – rajivRaja

+1

JSON은 이전 버전의 IE에서는 사용할 수없는 것 같습니다. 누군가가 알고 싶어한다고 생각했습니다. 그래도 여전히 최선의 방법이라고 생각합니다. – misterte

7

사실 이것은 장고가 아닌 이상한 jQuery입니다. test 변수에는 JSON이 아니라 실제 JS 객체가 들어 있습니다. jQuery는 가장 잘 알려진 이유 때문에 게시하기 전에이를 아주 이상한 형식으로 구문 분석합니다. 따라서 결과를 얻을 수 있습니다. 대신 이런 짓을하는 경우 (모든 일의 주위에 따옴표를주의) : 당신이 다음 할 필요가있는 유일한 일은 json.loads(ret['json_data'])를 호출하는 것입니다 :

var test = '[{"id": 1},{"id": 2},{"id": 3}]'; 

당신은 매우 거의 QueryDict가 예상 얻을 찾을 것입니다.

또한 이해할 수없는 이유로. jQuery에는 객체 배열을 JSON으로 변환하는 기능이 없습니다. 이를 위해 플러그인 또는 별도의 라이브러리를 찾아야합니다.

+1

인류에 대한 신념이 회복되었습니다. 고맙습니다! 나는 거의 효과가있다. 이 동작의 이유를 아는 것은 좋을 것입니다. (아마도 writeup/links가 있습니까?) – rajivRaja