I recently started working with Python and I am trying to concatenate one of my JSON String with existing JSON String. I am also working with Zookeeper so I get the existing json string from zookeeper node as I am using Python kazoo library.
# gets the data from zookeeper
data, stat = zk.get(some_znode_path)
jsonStringA = data.decode("utf-8")
if I print jsonStringA
it gives me like this -
{"error_1395946244342":"valueA","error_1395952003":"valueB"}
But if I do print json.loads(jsonString)
then it prints out like this -
{u'error_1395946244342': u'valueA', u'error_1395952003': u'valueB'}
Here jsonStringA
will have my existing JSON String. Now I have another key-value pair which I need to add in the exiting jsonStringA
-
Below is my Python code -
# 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"
My existing jsonStringA
will be like this after extracting from zookeeper -
{"error_1395946244342":"valueA","error_1395952003":"valueB"}
Now I need to append this key-value pair in the jsonStringA
-
"timestamp_in_ms":"Error Occured on machine "+host_info+" in datacenter "+ local_dc +" on the "+ step +" of process "+ c +"
So in short I need to merge below key-value pair -
"error_1395952167":"Error Occured on machine h1 in datacenter dc3 on the step2 of process test"
So final JSON String will look like this -
{"error_1395946244342":"valueA","error_1395952003":"valueB","error_1395952167":"Error Occured on machine h1 in datacenter dc3 on the step2 of process test"}
Is this possible to do?
As of Python 3.5, you can merge two dicts with:
(https://www.python.org/dev/peps/pep-0448/)
So:
etc.
You can load both json strings into Python Dictionaries and then combine. This will only work if there are unique keys in each json string.
What do you mean by merging? JSON objects are key-value data structure. What would be a key and a value in this case? I think you need to create new directory and populate it with old data:
Merging method is obviously up to you.
Merging json objects is fairly straight forward but has a few edge cases when dealing with key collisions. The biggest issues have to do with one object having a value of a simple type and the other having a complex type (Array or Object). You have to decide how you want to implement that. Our choice when we implemented this for json passed to chef-solo was to merge Objects and use the first source Object's value in all other cases.
This was our solution:
You could add another case after the first case to check for lists if you want to merge those as well, or for specific cases when special keys are encountered.
To append key-value pairs to a json string, you can use
dictA.update(dictB)
.For your case, this will look like this:
Assuming a and b are the dictionaries you want to merge:
To convert your string to python dictionary you use the following:
Update: full code using strings:
But I have to say that in general what you are trying to do is not the best practice. Please read a bit on python dictionaries.
Alternative solution:
And actually you can avoid all these if you just use an array to hold all your errors.