【问题标题】:How to add a key value list to a json dict [duplicate]如何将键值列表添加到json dict [重复]
【发布时间】:2016-04-08 18:51:23
【问题描述】:

我有一个像这样的字典:

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 ValueError('格式错误的字符串')

ValueError: malformed string

【问题讨论】:

  • 这基本上归结为回答问题:Handling lazy JSON in Python。您有非 JSON 输入(如果您正确呈现它们,它们是 JS 对象文字,但 JS 对象文字是 JSON 的超集;JSON 需要引用属性名称); Python 的 json 模块无法处理。解决解析问题,更新很简单。
  • 这个问题与 JSON 有什么关系?

标签: python json dictionary


【解决方案1】:

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】:
str0 = "key3:val3, key4:val4"
or
str = "{key3:val3, key4:val4}"

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

这个 sn-p 对我来说很好用:

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】:

    基本上你需要对字符串进行字符串操作,将输入的字符串转换成你分析所需的形式

    如果您的数据结构类似

    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
    

    【讨论】:

    • 一般来说,如果你能找到一个合法的解析器,你就想使用它。自己发明是在极端情况下处理格式错误的好方法。例如,在这种情况下,使用建议的demjson 模块here 可能是更安全的解决方案。 JS 对象字面量表示法(如 csv 和 XML)不是您想要使用自己的解析器的东西;出错的方法太多了。
    【解决方案4】:
    1. data.update 不起作用,因为它只接受 dict 作为输入
    2. 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'>
    

    因此,很明显您的 str0 或 str 格式因缺少引号而出错。

    修复它:

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

    使用选项 2,以下代码将适用于 str0 格式

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

    希望它能回答你的问题。

    【讨论】:

      【解决方案5】:

      由于这些字符串是无效的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)))
      

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 2014-08-07
        • 2020-02-25
        相关资源
        最近更新 更多