2016-08-10 2 views
0

내 장고 프로젝트 중 하나에서 "ODK"통합을 사용하고 있습니다.비 문자열 값을 파이썬에서 json 키로 가져 오기

나는 그 안에있는 모든 키가 비 문자열이되는 방식으로 장고보기에서 응답 (request.body)에서 json 형식을 얻고 있습니다. 예 : 거기에 키 이후

{ 
    key1 : "value1", 
    key2 : "value2" 
} 

내가 어떻게 json.I 내부의 값이 하나가 JSON의 유형을 알아야 방법을 순서대로 진행하기 위해 액세스하는 아무 생각이 아닌 문자열입니다 json을 사전으로 변환하십시오.

는 JSON 파일이 점점 오전 : 인용 부호로 둘러싸이지 않은 키 이름과 마지막에 콤마 :

다른 사람들이 지적했듯이
{ 

token: "testauthtoken", 
content: "record", 
formId: "maintenance_ct", 
formVersion: "", 

} 
+1

어떻게 그들이 문자열이 아닌합니까? 키를 반복하고 각 키의 유형을 '인쇄'하면 어떻게됩니까? – DeepSpace

+0

JSON 형식의 형식을 문자열로 표시하면 JSON 파일 전체가 단일 문자열입니다. –

+0

JSON은 키 이름 만 문자열로 허용합니다. https://stackoverflow.com/questions/8758715/using-number-as-index-json ('json.loads()'로 스 니펫을로드하면 예외가 발생합니다. – Levi

답변

1

, 이것은 두 가지 이유에서 유효하지 JSON입니다.

가능하면 올바른 JSON을 생성하기 위해 이것을 생성하는 서버 코드를 수정하는 것이 가장 좋습니다. 아마도이 코드는 문자열을 수동으로 붙여 넣어 "JSON"을 생성하고 있을까요? 그렇다면 대신 json.dumps()을 사용하도록 변경할 수 있습니다. 그러면 유효한 JSON이 제공됩니다.

"JSON"텍스트를 사전 처리하여 키 이름을 따옴표로 묶고 후행 쉼표를 제거 할 수 있습니다. 이것은 조금 깨지기 쉬운 될 수 있지만, 비슷한 남아 입력 데이터의 형식을 알고있는 경우에, 그것을 할 수있는 하나 개의 방법 :

import json, re 

badJson = ''' 
{ 

token: "testauthtoken", 
content: "record", 
formId: "maintenance_ct", 
formVersion: "", 

} 
''' 

print('badJson:') 
print(badJson) 

goodJson = re.sub(r'\n\s*(\S+)\s*:', r'\n"\1":', badJson) 
goodJson = re.sub(r',\s*}', r'\n}', goodJson) 
print('goodJson:') 
print(goodJson) 

goodData = json.loads(goodJson) 
print('goodData:') 
print(goodData) 

이 지문 :

badJson: 

{ 

token: "testauthtoken", 
content: "record", 
formId: "maintenance_ct", 
formVersion: "", 

} 

goodJson: 

{ 
"token": "testauthtoken", 
"content": "record", 
"formId": "maintenance_ct", 
"formVersion": "" 
} 

goodData: 
{'formId': 'maintenance_ct', 'content': 'record', 'token': 'testauthtoken', 'formVersion': ''} 

내가 처음 쓴 대답 나는 질문을 오해하고 파이썬 대신 자바 스크립트 솔루션을 제공했다. 여기에 남겨두면 유용 할 것입니다.

입력 텍스트가 유효한 JSON이 아니지만 올바른 JavaScript 객체 리터럴입니다. 따라서 이것을 그대로 취급하고 eval()을 사용하여 파싱 할 수 있습니다. 실제로 이것은 jQuery와 같은 라이브러리가 JSON.parse()을 지원하지 않는 구식 브라우저에서 JSON을 구문 분석하는 방법입니다.

주의 : 당신은이 데이터 문자열의 출처를 신뢰할 수있는 것이 좋습니다. 실행 코드로 취급하고 있기 때문입니다!

// Set up a string like your input data string. 
 
// All on one line here so we can use a string constant for testing, 
 
// but your multiline data string will work the same. 
 
var dataString = '{ token: "testauthtoken", content: "record", formId: "maintenance_ct", formVersion: "", }' 
 

 
// Now use eval() to convert it to a JavaScript object. 
 
// We wrap the string in parentheses so it will parse as an expression. 
 
var data = eval('(' + dataString + ')'); 
 

 
// Finally, we can access the values. 
 
console.log('token: ', data.token); 
 
console.log('content: ', data.content); 
 
console.log('formId: ', data.formId); 
 
console.log('formVersion: ', data.formVersion);

관련 문제