I have solved this by using following method:
My actual data was :
first_json = {"basic_info":[{"indexPos": "0", "isUpper": "1", "placeHolder": "NAME THIS CARD (Required)", "value": "ddd", "keyName": "CardName"},{"indexPos": "0", "isUpper": "1", "placeHolder": "NAME THIS CARD (Required)sddd", "value": "", "keyName": "CardName11"}]}
second_json = {"basic_info": [{"indexPos": "0", "isUpper": "1", "placeHolder": "NAME THIS CARD (Required)sddd", "value": "wwwwwwwwww", "keyName": "CardName"},{"indexPos": "0", "isUpper": "1", "placeHolder": "NAME THIS CARD (Required)sddd", "value": "dsfsdfd", "keyName": "CardName11"}]}
third_json = second_json.copy()
self.mergeDict(third_json, first_json)
print third_json
and our mergeDict function :
def mergeDict(self,s, f):
for k, v in f.iteritems():
if isinstance(v, collections.Mapping):
r = self.mergeDict(s.get(k, {}), v)
s[k] = r
elif isinstance(v, list):
result = []
""" TODO : optimization """
if k == 'basic_info':
for valf in v:
if 'keyName' in valf:
for vals in s.get(k, {}):
if valf['keyName'] in vals.values() and vals['value'] !="" and valf['value'] == "":
valf['value'] = vals['value']
result.append(valf)
""" Reverse loop is for check extra data in second business card """
for vals1 in s.get(k, {}):
if 'keyName' in vals1:
check = 0
for valf1 in v:
if vals1['keyName'] in valf1.values():
check = 1
if not check:
result.append(vals1)
else:
v.extend(s.get(k, {}))
for myDict in v:
if myDict not in result:
result.append(myDict)
s[k] = result
else:
#------------- If the key is blank in first business card then second business card value assign to it -----#
if not v and s.get(k, {}):
#f[k] = s.get(k, {})
pass
else:
s[k] = f[k]
return s
This merge function gives us what was required. Please suggest if I could optimize further.