【问题标题】:Python 2.7 - Take two JSON's and combine the string field values together and add int fieldsPython 2.7 - 取两个 JSON 并将字符串字段值组合在一起并添加 int 字段
【发布时间】:2016-04-22 11:00:16
【问题描述】:

我正在尝试获取两个由整数和字符串混合组成的 JSON,并使用 python 2.7 将它们组合在一起。

例如:

{"key": {"field_string": ["string"],"field_num": 1}}
{"key": {"field_string": ["another_string"],"field_num": 2}}

我正在尝试做的要求是:

  • 密钥将保持不变,合并后需要保持不变
  • 整数需要相加,因此 1 + 2 = 3,字符串需要以数组格式相加(它们已经在上面的数组中)。
  • 每个 JSON 的字段范围,大多数 JSON 将有 4-7 个字段

基于上述内容,我希望输出的示例:

{"key": {"field_string": ["string","another_string"],"field_num": 3}}

另外,我使用它的项目将在无法访问互联网的机器上,所以如果可能的话,我需要它来使用标准 python 库。

对此的任何帮助将不胜感激。我发现的大多数示例都涉及将两个 JSON 对象组合在一起,但是,整数不会被添加,这是我需要进行的关键部分。

更新

关于这方面的更多背景知识,这是我正在进行的一个项目,我无法在后面详细介绍,但是,我可以给出一个伪代码示例。

我所做的基本想法是,我需要组合很多 JSON。在示例中,我只是将其列为两个,但是在我的代码的最终版本中,它将处理数千个 JSON(大数据项目)。它的 JSON 部分只是我想要完成的一小部分,但却是一个关键部分。

这里是一个 JSON 结构的示例:

{
  "key1": {
    "blue_data": 12,
    "green_data": 0,
    "red_data": [],
    "yellow_Data": [
      "string_1",
      "string_2",
      "string_3"
    ],
    "foo": "XX",
    "bar": "YYY",
    "foobar": "ZZZZ"
  }
}

但是,有些字段可能会被省略,例如最后 3 个字段可能包含也可能不包含,或者它们的子集。

JSON 对象传递给我的脚本的方式是数组的形式。因此,该数组将保存一系列我使用 for 循环迭代的 JSON。

for key in list_of_keys:
    for item in json_list:
        json_dump_data = json.loads(item)
        try:
            json_blue_data[key]
        except:
            json_blue_data[key] = int(json_dump_data["blue_data"])
        else:
            json_data_data[key] = json_blue_day[key] + int(json_dump_data["blue_data"])

我对每个值都做了与上述类似的事情,我基本上会将每个字段分解为一个 dict 对象并在最后将它们组合起来。我知道这不是最有效的方法,但是我是新手并且使用预先存在的代码。

【问题讨论】:

  • 将 JSON 转换为 Python 对象(字典),做你需要的并将 Python 对象(字典)转换为 JSON - 使用JSON 标准模块。
  • 请提供一个演示A range of fields per JSON, most JSON's will have between 4-7 fields要求的示例

标签: python json python-2.7 dictionary bigdata


【解决方案1】:

这是假设所有键都具有相同的值类型。

它允许深度高达约 1000(默认 Python 最大堆栈深度)

import json

obj1 = json.loads('{"key": {"field_string": ["string"],"field_num": 1}}')
obj2 = json.loads('{"key": {"field_string": ["another_string"],"field_num": 2}}')

def combine(obj1, obj2):
    for k, v in obj1.items():
        if k in obj2:
            if isinstance(v, dict):
                combine(obj1[k], obj2[k])
            else:
                # assume list or int based on problem description
                obj1[k] = obj1[k] + obj2[k]


combine(obj1, obj2)
print json.dumps(obj1)

输出:

{"key": {"field_string": ["string", "another_string"], "field_num": 3}}

【讨论】:

  • list + list 也有效,因此可以简化,检查 dict 并递归 else obj1[k] += obj2[k]
  • 很好的建议。已添加。
  • NP。顺便说一句,x += yx = x + y 更有效 - 对于列表,因为前者对@​​987654327@ 进行就地更新,而不是创建第三个列表,然后将其分配给x
【解决方案2】:

将 JSON 转换为 Python 对象(字典),做你需要的并将 Python 对象(字典)再次转换为 JSON。使用 JSON 标准模块。

import json

# input JSON
json1 = '{"key": {"field_string": ["string"],"field_num": 1}}'
json2 = '{"key": {"field_string": ["another_string"],"field_num": 2}}'

# convert JSON to Python dictionary
dict1 = json.loads(json1)
dict2 = json.loads(json2)

# create dictionary for results
dict3 = {'key': {}}

# do what you need
dict3['key']['field_string'] = dict1['key']['field_string'] + dict2['key']['field_string']
dict3['key']['field_num'] = dict1['key']['field_num'] + dict2['key']['field_num']

# convert result to JSON
json3 = json.dumps(dict3)

print(json3)

# {"key": {"field_num": 3, "field_string": ["string", "another_string"]}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2017-04-19
    • 1970-01-01
    • 2015-06-25
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多