2012-12-20 1 views
1

I 파이썬 코드의 다음 블록이 : 이제Python에서 JSON 구문 분석 : 형식 변경 후 has_key()를 다시 사용하려면 어떻게해야합니까?

"derivedFrom": {"source": "FOO", "model": "BAR", "derivedIds": ["123456"]} 

형식이 변경 :

"derivedFrom": "{\"source\": \"FOO.\", \"model\": \"BAR\", \"derivedIds\": [\"123456\"] 

data = json.loads(line) 
if data.has_key('derivedFrom'): 
    dFin = data['derivedFrom'] 
    if dFin.has_key('derivedIds'): 

이이 같은 JSON의 블록에 제대로 작동하는 데 사용

그리고 파이썬 블록의 마지막 줄은 다음과 같은 예외를 던집니다 :

'unicode' object has no attribute 'has_key' 

has_key이 다시 작동하도록 JSON을 사전 처리하는 방법이 있습니까?

+1

형식이 어떻게 변경 되었습니까? 또한 해당 블록이 유효한 JSON이 아닙니다. – Blender

+2

"변경된"형식이 유효한 JSON이 아닙니다. 그것은 전혀 구문 분석하지 않습니다. –

+4

그리고'foo.has_key (bar)'는 최소한 Python 2.4 이후로'bar in foo'라는 철자가 있습니다. –

답변

5
"{\"source\": \"FOO.\", \"model\": ... 

보다 강력한 접근 방식은 Duck Typing가 사용할 수 JSON 문자열 리터럴 안에 JSON 개체가 있습니까? 내부 JSON의 속성을 얻으려면 다시 해독해야합니다.

data = json.loads(line) 
if 'derivedFrom' in data: 
    dFin = json.loads(data['derivedFrom']) 
    if 'derivedIds' in dFin: 
     .... 

JSON -에 - JSON은 일반적으로 거의 그것에 대한 필요가 없습니다으로 실수 - 어떤이 출력을 생산하고, 그것은 고정 필요합니까?

0

derivedFrom 속성을 JSON 개체에서 문자열로 변경하고 있습니다. 문자열에는 has_key라는 속성이 없습니다.

1

사용 :

'derivedIds' in dFin 

이 유니 코드로는 오탐 (false positive)을 줄 수에도 불구하고, 사전에와 유니 코드 모두에서 작동합니다. 당신이 일을 코드의 동일한 블록을 원하는 경우

try: 
    dFin = json.loads(data['derivedFrom']) #assume new format 
except TypeError: 
    dFin = data['derivedFrom'] #it's already a dict 
if 'derivedIds' in dFin: # or dFin.has_key('derivedIds') 
    #etc 
0

약간 다음에 새로운 형식을 조정 고려 :

"{\"derivedFrom\": {\"source\": \"FOO.\", \"model\": \"BAR\", \"derivedIds\": [\"123456\"]}}"