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

Python 如何将键值列表添加到json dict,python,json,dictionary,Python,Json,Dictionary,我的口述是: data = { 'key1': value1, 'key2': value2 } 现在,我如何附加存储在字符串中的键值列表,如 str0 = "key3:val3, key4:val4" or str = "{key3:val3, key4:val4}" 进入上面的json目录 print data.update(str) print data.update(ast.literal_eval(str)) 给出了错误 (还尝试了将引号添加到键)

我的口述是:

data = {
        'key1': value1,
        'key2': value2
}
现在,我如何附加存储在字符串中的键值列表,如

str0 = "key3:val3, key4:val4"
or
str = "{key3:val3, key4:val4}"
进入上面的json目录

print data.update(str)
print data.update(ast.literal_eval(str))
给出了错误

(还尝试了将引号添加到键) raise VALUERROR('格式错误的字符串')


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'}
如果必须坚持原始格式,则必须编写所有者解析器,如中所述

这些不是格式良好的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}

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

如果您的数据结构类似

str0 = "key3:val3, key4:val4"
然后采取这种方法

for item in str0,split(','):
    key,value = item.split(':')
    data[key] = value
str = str.replace("{","").replace("}","")
for item in str.split(","):
    key, value = item.split(':')
    data[key] = value
当您的输入字符串采用此格式时

str = "{key3:val3, key4:val4}"
采取这种方法

for item in str0,split(','):
    key,value = item.split(':')
    data[key] = value
str = str.replace("{","").replace("}","")
for item in str.split(","):
    key, value = item.split(':')
    data[key] = value
  • data.update将不起作用,因为它只接受dict作为输入
  • ast.literal_eval(str)不起作用,因为str的格式不正确
  • 请尝试以下操作:

    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'>
    

    希望它能回答您的问题。

    由于这些字符串无效
    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'}
    
    您还可以使用dictionary的更新方法来更新
    数据
    dictionary。像

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

    你不能就这样“改变”一个变量。这就是他提供的数据这基本上可以归结为回答以下问题:。您已经获得了非JSON输入(如果您正确地呈现了它们,那么它们是JS对象文本,但是JS对象文本是JSON的超集;JSON需要引用属性名);Python的
    json
    模块无法处理这个问题。要解决解析问题,更新很简单。这个问题与JSON有什么关系?通常,如果你能找到一个合法的解析器,你就要使用它。发明你自己的是一个伟大的方式来处理格式错误的边缘案件。例如,在这种情况下,使用建议的
    demjson
    模块可能是更安全的解决方案。JS对象文字符号(如csv和XML)并不是您想要为其使用自己的解析器的东西;有太多的方法让它出错。
    data.update(dict(re.findall(pat, str0)))