2016-07-13 3 views
2

Я беру файл json и копирую только необходимые ключи и их значения в новый json-файл. Я получаю сообщение об ошибке «TypeError: строковые индексы должны быть целыми» в отношении того, где я копирую значения в myDict. Из того, что я собираю, json.load возвращает строку, а не словарь. Я проверил json-файл и имел действительный json-формат. Я использую Python 2.7.12. Я искал везде и не нашел ответа, который отвечает на мою конкретную проблему. Любая помощь, которую вы можете мне дать, очень ценится.Python json.load возвращает строку вместо словаря

import os 
import sys 
import json 

def stripSpec(inp, outp): 
    #Load json file as python dictionary 
    obj = json.load(open(inp, "r")) 

    result=[] 

    #Go through JSON and save necessary keys and values 
    for i in obj: 
     myDict = {} 
     myDict["id"]=i.get('id').get('value') 
     myDict["data"]["BaselineExposure"]=i.get('data').get('BaselineExposure').get('value') 
     myDict["data"]["ColorMatrix2"]=i.get('data').get('ColorMatrix2').get('value') 
     result.append(myDict) 

    # Output the updated file with pretty JSON 
    open(outp, "w").write(json.dumps(result, sort_keys=True, indent=4, ensure_ascii=False, separators=(',', ':'))) 
    return 

#Save input and output paths as variables 
inp = sys.argv[1] 
outp = sys.argv[2] 

#Call function 
stripSpec(inp, outp) 

пример json находится здесь. Это было резко сокращено, но в основном есть несколько записей для каждой модели камеры

[ 
{ "id": "Canon EOS 100D", 
"data":[{ 
    "SourceFile": "./Canon 100D/canon_eos_100d_11.dng", 
    "ExifToolVersion": 10.07, 
    "Directory": "./Canon 100D", 
    "FileSize": "18 MB", 
    "FileModifyDate": "2016:05:02 23:03:14-07:00", 
    "FileAccessDate": "2016:05:03 01:45:03-07:00", 
    "FileInodeChangeDate": "2016:05:02 23:03:14-07:00", 
    "FilePermissions": "rw-r--r--", 
    "ColorMatrix2": "0.6602 -0.0841 -0.0939 -0.4472 1.2458 0.2247 -0.0975 0.2039 0.6148", 
    "CameraCalibration1": "1.0648 0 0 0 1 0 0 0 0.9881", 
    "CameraCalibration2": "1.0648 0 0 0 1 0 0 0 0.9881", 
    "AnalogBalance": "1 1 1", 
    "AsShotNeutral": "0.512769 1 0.584809", 
    "BaselineExposure": -0.25, 
    "RedBalance": 1.950195 
    }] 
}, 

ответ

2

В вашем JSon заглушкой "data" ключ содержит список. В вашем кодексе вы ссылаетесь на него как на словарь: i.get('data').get('BaselineExposure')

Вместо этого вы должны проходить через ваш "data". Например:

data = i.get('data') 
for d in data: 
    print(d.get('BaselineExposure')) 

Так в основном быть осторожным с вложенными пунктами.

Также почему вы используете i.get('id').get('value'). Вместо этого i.get('id') должно быть достаточно, и дополнительные .get('value') должны поднять AttributeError, не так ли?

Смежные вопросы