J'ai besoin de comparer deux chaînes qui représentent des objets JSON. À des fins de test, j'ai besoin d'un moyen de comparer ces chaînes ignorant non seulement l'ordre des éléments de l'enfant (qui est assez courant) mais de l'ordre des éléments dans les propriétés de la matrice de Jsons. IE:
group: { id: 123, users: [ {id: 345, name: Mike}, {id: 234, name: John} ] }
6 Réponses :
Je ne sais pas si cette chose existe, mais vous pouvez la mettre en œuvre vous-même.
Vous pouvez couper les matrices, triez-les par ID, puis les limitez-les à JSON et comparez les chaînes. Pour beaucoup de membres, cela devrait fonctionner assez vite. Si vous dupliquez des identifiants en double, cela échouera car Trier ne changera pas la commande. P>
Cela ressemble à une solution Java, mais l'OP étiqueté la question avec JavaScript.
"Mais d'autres approches bienvenues pour" C'est une autre approche :)
Cherchait une approche Java. Je ne m'attendais pas à le trouver ici :)
un exemple de celui-ci avec des étuis de test: strong> p> p> <div id=out></div>
Je serais reconnaissant si quelqu'un découvre une affaire de bord qui ne fonctionne pas avec cette solution.
Eh bien, l'exemple original de l'OP, pour une chose :) Le problème est que la mise en œuvre devrait essentiellement traiter des tableaux en tant que jeux.
J'aime la solution de Francis et ça va très bien.
Il suffit d'ajouter la vérification nulle suivante au début de la fonction code> égale > pour empêcher les erreurs avec des entrées NULL ou non définies. P>
function equal(a, b) { if (a == null && b == null) { return true; } if (a == null || b == null) { return false; } if (typeof a !== typeof b) return false; if (a.constructor !== b.constructor) return false; if (a instanceof Array) { return arrayEqual(a, b); } if(typeof a === "object") { return objectEqual(a, b); } return a === b; } function objectEqual(a, b) { for (var x in a) { if (a.hasOwnProperty(x)) { if (!b.hasOwnProperty(x)) { return false; } if (!equal(a[x], b[x])) { return false; } } } for (var x in b) { if (b.hasOwnProperty(x) && !a.hasOwnProperty(x)) { return false; } } return true; } function arrayEqual(a, b) { if (a.length !== b.length) { return false; } var i = a.length; while (i--) { var j = b.length; var found = false; while (!found && j--) { if (equal(a[i], b[j])) found = true; } if (!found) { return false; } } return true; }
Cette réponse décrit une solution pour le problème à l'aide de Deltajson API de repos. Deltajson est un produit commercial qui fournit l'API sous forme de service (SaaS) ou via un serveur de repos pouvant être exécuté localement:
Arrayalignment code> sur sans commande code>. li>
ol> Le code exemple ci-dessous montre comment appeler l'API avec ce paramètre de propriété: P>
{
"dx_deltaJSON": {
"dx_data_sets": "A!=B",
"dx_deltaJSON_type": "diff",
"dx_deltaJSON_metadata": {
"operation": {
"type": "compare",
"input-format": "multi_part",
"output-format": "JSON"
},
"parameters": {
"dxConfig": [],
"arrayAlignment": "orderless",
"wordByWord": false
}
},
"dx_deltaJSON_delta": {
"id": 123,
"users": [
{
"id": 345,
"name": {
"dx_delta": {
"A": "Mike",
"B": "Mikey"
}
}
},
{
"id": 234,
"name": "John"
}
]
}
}
}
Peut-être que celui-ci aiderait? Stackoverflow.com/questions/4465244/compara-2-json-Objects < / a>