Python 2.7 - 取两个 JSON 并将字符串字段值组合在一起并添加 int 字段
Python 2.7 - Take two JSON's and combine the string field values together and add int fields
我正在尝试取两个由整数和字符串混合组成的 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"])
我对每个值都做了与上面类似的事情,我基本上会将每个字段分解为一个字典对象,然后在最后将它们组合起来。我知道这不是执行此操作的最有效方法,但是我是新手并且正在使用预先存在的代码。
将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"]}}
这是假设所有键都具有相同的值类型。
它允许深度达到约 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}}
我正在尝试取两个由整数和字符串混合组成的 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"])
我对每个值都做了与上面类似的事情,我基本上会将每个字段分解为一个字典对象,然后在最后将它们组合起来。我知道这不是执行此操作的最有效方法,但是我是新手并且正在使用预先存在的代码。
将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"]}}
这是假设所有键都具有相同的值类型。
它允许深度达到约 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}}