如何在Python中合并两个json字符串?

2024-05-03 23:11:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始使用Python,并尝试将我的一个JSON字符串与现有的JSON字符串连接起来。我还与Zookeeper一起工作,因此在使用Python kazoo库时,我从Zookeeper节点获取现有的json字符串。

# gets the data from zookeeper
data, stat = zk.get(some_znode_path)
jsonStringA = data.decode("utf-8")

如果我打印jsonStringA它会给我这样的-

{"error_1395946244342":"valueA","error_1395952003":"valueB"}

但如果我这样做了,它就会像这样打印出来-

{u'error_1395946244342': u'valueA', u'error_1395952003': u'valueB'}

这里jsonStringA将有我现有的JSON字符串。现在我有另一个键值对,需要添加到正在退出的jsonStringA-

下面是我的Python代码-

# gets the data from zookeeper
data, stat = zk.get(some_znode_path)
jsonStringA = data.decode("utf-8")

timestamp_in_ms = "error_"+str(int(round(time.time() * 1000)))
node = "/pp/tf/test/v1"
a,b,c,d = node.split("/")[1:]
host_info = "h1"
local_dc = "dc3"
step = "step2"

我现有的jsonStringA在从zookeeper提取后将是这样的-

{"error_1395946244342":"valueA","error_1395952003":"valueB"}

现在我需要将这个键值对附加到jsonStringA-

"timestamp_in_ms":"Error Occured on machine "+host_info+" in datacenter "+ local_dc +" on the "+ step +" of process "+ c +"

所以简而言之,我需要合并到键值对下面-

"error_1395952167":"Error Occured on machine h1 in datacenter dc3 on the step2 of process test"

所以最终的JSON字符串将如下所示-

{"error_1395946244342":"valueA","error_1395952003":"valueB","error_1395952167":"Error Occured on machine h1 in datacenter dc3 on the step2 of process test"}

这有可能吗?


Tags: the字符串intestjsondataonerror
3条回答

假设a和b是要合并的词典:

c = {key: value for (key, value) in (a.items() + b.items())}

要将字符串转换为python字典,请使用以下命令:

import json
my_dict = json.loads(json_str)

更新:使用字符串的完整代码

# test cases for jsonStringA and jsonStringB according to your data input
jsonStringA = '{"error_1395946244342":"valueA","error_1395952003":"valueB"}'
jsonStringB = '{"error_%d":"Error Occured on machine %s in datacenter %s on the %s of process %s"}' % (timestamp_number, host_info, local_dc, step, c)

# now we have two json STRINGS
import json
dictA = json.loads(jsonStringA)
dictB = json.loads(jsonStringB)

merged_dict = {key: value for (key, value) in (dictA.items() + dictB.items())}

# string dump of the merged dict
jsonString_merged = json.dumps(merged_dict)

但我不得不说,总的来说,你试图做的并不是最佳实践。请阅读一些python字典。


替代解决方案:

jsonStringA = get_my_value_as_string_from_somewhere()
errors_dict = json.loads(jsonStringA)

new_error_str = "Error Ocurred in datacenter %s blah for step %s blah" % (datacenter, step)
new_error_key = "error_%d" % (timestamp_number)

errors_dict[new_error_key] = new_error_str

# and if I want to export it somewhere I use the following
write_my_dict_to_a_file_as_string(json.dumps(errors_dict))

实际上,如果使用数组保存所有错误,就可以避免所有这些错误。

从Python3.5开始,您可以将两个dict合并为:

merged = {**dictA, **dictB}

https://www.python.org/dev/peps/pep-0448/

所以:

jsonMerged = {**json.loads(jsonStringA), **json.loads(jsonStringB)}
asString = json.dumps(jsonMerged)

等等

您可以将这两个json字符串加载到Python字典中,然后进行组合。只有在每个json字符串中都有唯一的键时,这才有效。

    import json

    a = json.loads(jsonStringA)
    b = json.loads(jsonStringB)
    c = dict(a.items() + b.items())
    # or c =  dict(a, **b)

相关问题 更多 >