如何将键值列表添加到json dict

时间:2016-01-05 02:39:55

标签: python json dictionary

我有一个像这样的词典:

data = {
        'key1': value1,
        'key2': value2
}

现在我如何追加存储在字符串中的键值列表,如

str0 = "key3:val3, key4:val4"
or
str = "{key3:val3, key4:val4}"

进入上面的json dict?

print data.update(str)
print data.update(ast.literal_eval(str))

给出错误。

(也尝试过按键引用) 提出ValueError('格式错误的字符串')

ValueError: malformed string

5 个答案:

答案 0 :(得分:1)

由于这些字符串不是有效的json字符串,并且这些字符串可能具有不同的结构,因此您必须解析字符串。要解析字符串,可以使用正则表达式。如果模式好,那么它可以处理不同的字符串。举个例子:

import re

pat = re.compile(r'(\w+):(\w+)')  # \w matches any alphanumeric character

str0 = "key3:val3, key4:val4"
str1 = "{key3:val3, key4:val4}"

print dict(re.findall(pat, str0))
print dict(re.findall(pat, str1))

这将为您提供输出:

{'key3': 'val3', 'key4': 'val4'}
{'key3': 'val3', 'key4': 'val4'}

您还可以使用字典的更新方法更新data字典。等,

data.update(dict(re.findall(pat, str0)))

答案 1 :(得分:0)

str格式不正确的JSON字符串。如果您可以使用str = "{'key3':'val3', 'key4':'val4'}"格式生成JSON字符串,它应该可以正常工作。

>>> import ast
>>> data = {'key1': 'value1', 'key2': 'value2'}
>>> str = "{'key3':'val3', 'key4':'val4'}"
>>> data.update(ast.literal_eval(str))
>>> data
{'key3': 'val3', 'key2': 'value2', 'key1': 'value1', 'key4': 'val4'}

如果您必须坚持原始格式,则必须按照PyNEwbie's answer中的指示编写所有者解析器。

答案 2 :(得分:0)

str0 = "key3:val3, key4:val4"
or
str = "{key3:val3, key4:val4}"

这些不是格式良好的JSON字符串。 “JSONDecodeError:期望用双引号括起来的属性名称:”当用双引号括起键名时,JSON字符串是什么样的?请记住,您需要将外部单词更改为单引号

这个片段对我来说很好用:

import json

data = {
        'key1': 5,
        'key2': 3
}

str = '{"key3":3, "key4":2}'

foo = json.loads(str)
data.update(foo)
print(data)

>>> {'key3': 3, 'key2': 3, 'key4': 2, 'key1': 5}

答案 3 :(得分:0)

基本上,您需要对字符串应用字符串操作,以将字符串输入转换为分析所需的表单

如果您的数据结构类似

str0 = "key3:val3, key4:val4"

然后采取这种方法

for item in str0,split(','):
    key,value = item.split(':')
    data[key] = value

当您的输入字符串采用此格式时

str = "{key3:val3, key4:val4}"

采取这种方法

str = str.replace("{","").replace("}","")
for item in str.split(","):
    key, value = item.split(':')
    data[key] = value

答案 4 :(得分:0)

  1. data.update不起作用,因为它只接受dict作为输入
  2. ast.literal_eval(str)无效,因为str的形式不正确。
  3. 尝试以下方法:

    import json
    import ast
    data = {'key1': 'value1', 'key2':'value2'}
    print json.dumps(data) #stdout: {"key2": "value2", "key1": "value1"}
    data_after_ast = ast.literal_eval(json.dumps(data))
    print type(data_after_ast) #stdout: <type 'dict'>
    

    因此,很明显你的str0或str格式错误引用了。

    修复它:

    • 选项1:您预先处理了字符串并添加了引号
    • 选项2:直接解析原始字符串

    以下代码适用于使用选项2

    格式str0
     for s in str0.split(','):
         [key,value]=s.split(":")
         data.update({key:value})
    

    希望它能回答你的问题。