2015-03-03 2 views
0

Пожалуйста, свяжитесь со мной, чтобы ответить, если это уже было получено, моя проблема в том, что я хочу получить diff из многоуровневого json, который неупорядочен.Многоуровневый JSON diff в python

x=json.loads('''[{"y":2,"x":1},{"x":3,"y":4}]''') 
y=json.loads('''[{"x":1,"y":2},{"x":3,"y":4}]''') 
z=json.loads('''[{"x":3,"y":4},{"x":1,"y":2}]''') 

import json_tools as jt 
import json_delta as jd 


print jt.diff(y,z) 
print jd.diff(y,z) 
print y==z 
print x==y 

выход

[{'prev': 2, 'value': 4, 'replace': u'/0/y'}, {'prev': 1, 'value': 3, 'replace': u'/0/x'}, {'prev': 4, 'value': 2, 'replace': u'/1/y'}, {'prev': 3, 'value': 1, 'replace': u'/1/x'}] 
[[[2], {u'y': 2, u'x': 1}], [[0]]] 
False 
True 

мой вопрос, как я могу получить у и г равными или, если есть фактические различия в зависимости от отсутствия порядка JSON.

вида маркированного списка словарей, но я ищу что-то что уровень доказательства, что это список/ДИКТ словарей списка/словари ...

ответ

0

решил его частично следующей функцию

def diff(prev,lat): 
    p=prev 
    l=lat 


    prevDiff = [] 
    latDiff = [] 

    for d1 in p[:]: 
     flag = False 
     for d2 in l: 
      if len(set(d1.items())^set(d2.items())) == 0: 
       p.remove(d1) 
       l.remove(d2) 
       flag = True 
       break 
     if not flag: 
      prevDiff.append(d1) 
      p.remove(d1) 

    prevDiff = prevDiff + p 
    latDiff = latDiff + l 

    resJSONdata=[] 
    if len(prevDiff) != 0: 
     resJSONdata.append({'prevCount':len(prevDiff)}) 
     resJSONdata.append({'prev':prevDiff}) 
    if len(latDiff) != 0: 
     resJSONdata.append({'latestCount':len(latDiff)}) 
     resJSONdata.append({'latest':latDiff}) 

#  return json.dumps(resJSONdata,indent = 4,sort_keys=True) 
    return resJSONdata 

это не делает его рекурсивно на уровень в уровни, но для моей цели это решается вопрос

0

проверить этот питон библиотека jsondiff, которая поможет вам идентифицировать дифф-х

import json 

import jsondiff 

json1 = json.loads(
    '{"isDynamic": false, "name": "", "value": "SID:<sid>", "description": "instance","argsOrder": 1,"isMultiSelect": false}') 

json2 = json.loads(
    '{ "name": "", "value": "SID:<sid>","isDynamic": false, "description": "instance","argsOrder": 1,"isMultiSelect": false}') 

res = jsondiff.diff(json1, json2) 
if res: 
    print("Diff found") 
else: 
    print("Same") 
Смежные вопросы