我正在尝试向 json 对象添加一个新的嵌套键,但我似乎无法使其正常工作,并且不确定我做错了什么。我也想知道这是最有效的方法吗?
def create_file(qle_folder, param_values):
json_list= []
files = [os.path.join(qle_folder, f) for f in os.listdir(folder) if os.path.isfile(os.path.join(qle_folder, f))]
for filename in files:
with open(filename) as f:
for l in f:
doc = json.loads(l)
target_length = len(doc['targets'])
if target_length == 0:
continue
labelel_dict ={}
for i in range(target_length):
label = doc['targets'][i]['label'].strip().lower()
match = doc['targets'][i]['match'].strip().lower()
new_dict = {
'type': label,
'value': match
}
key_value = str(d).strip().lower()
key_value = json.dumps(key_value)
if key_value in values_dict:
value = values_dict[key_value]
value = str(value).strip("[]\"").lower()
#dLabel = {"distros": {"Tags": { label: []}}}
label_dict[label] = value
doc['Options'] =''
doc['Options']['Tags']= label_dict
#doc['Options'] = d['Options']
doc = json.dumps(doc)
print(doc)
json_list.append(doc + '\n')
return json_list
最终文件应如下所示:
{
"targets": [
{
"start": 40,
"end": 73,
"label": "test:image",
"match": "the cathedral"
}
{
"start": 40,
"end": 74,
"label": "test:text",
"match": "some text"
}
],
"Options": {
"Tags": {
"test:image": [
"test 1",
"test 3",
"test 4",
]
"test:text": [
"test 1",
"test 3",
"test 4",
]
}
}
}
value_dict 看起来像这样,包含一个由“类型”和“值”连接的键:
{"type": "test:image", "value": "the cathedral"}["['test 1']"]
{"type": "test:text", "value": "some text"}["['test 3']"]
我收到的错误是
TypeError: 'str' object does not support item assignment
答案 0 :(得分:0)
您将 d
初始化为列表,然后尝试将其作为字典访问。
该行应该是:
d = {}
如果你需要它是一个列表,那么你需要以不同的方式设置以下几行:
new_dict = {
'type': label,
'value': match
}
看起来您还试图用双引号替换单引号,但我不知道为什么。您可以使用 json.dumps(d)
函数以 JSON 格式返回字典的有效字符串表示形式。
看来您正在将值转换为字符串,然后对它们进行评估。作为字典,您不需要这样做。我不太明白你想用 key_values 部分做什么.. 以下还不够:
for x in new-dict.keys():
if x in key_values:
// Do something