Je recherche une bibliothèque d'analyse JSON qui prend en charge la comparaison de deux objets JSON en ignorant l'ordre des enfants, en particulier pour les tests unitaires JSON retournant d'un service Web.
Est-ce que l'une des principales bibliothèques JSON prend en charge cela? La bibliothèque org.json fait simplement une comparaison de référence.
toString()
en charge la conversion de l'objet enJSON
chaîne.Réponses:
En règle générale, je déconseille généralement de laisser les dépendances sur un format de sérialisation particulier s'étendre au-delà de votre couche de stockage / réseau; ainsi, je vous recommande tout d'abord d'envisager de tester l'égalité entre vos propres objets d'application plutôt que leurs manifestations JSON.
Cela dit, je suis actuellement un grand fan de Jackson, ce que ma lecture rapide de leur implémentation ObjectNode.equals () suggère de faire la comparaison d'appartenance que vous souhaitez:
la source
Essayez JSONAssert de Skyscreamer .
Son mode non strict présente deux avantages majeurs qui le rendent moins fragile:
En mode strict, il se comporte plus comme la classe de test de json-lib.
Un test ressemble à ceci:
Les paramètres dans les JSONAssert.assertEquals () appel sont expectedJSONString , actualDataString et isstrict .
Les messages de résultat sont assez clairs, ce qui est important lors de la comparaison de très gros objets JSON.
la source
JSONAssert.assertEquals(expected, data, JSONCompareMode.NON_EXTENSIBLE);
Le mode NON_EXTENSIBLE signifie que tout champ nouveau ou manquant provoque des échecs, mais pas l'ordre. L'utilisation de false déclencherait le mode indulgent qui ne rapporterait aucun élément enfant supplémentaire ou manquant.Utilisation de GSON
Edit: Depuis GSON v2.8.6, la méthode d'instance
JsonParser.parse
est obsolète. Vous devez utiliser la méthode statiqueJsonParser.parseString
:la source
Je ferais ce qui suit,
la source
Vous pouvez essayer d'utiliser la classe JSONAssert de json-lib :
Donne:
la source
JSONAssert.assertJsonEquals( "{foo: 'bar', list: [{test: '1'}, {rest: '2'}] }", "{ foo: 'bar', list: [{rest: '2'}, {test: '1'}] }");
Avec le message:junit.framework.AssertionFailedError: : : objects differed at key [list];: arrays first differed at element [0];: objects differed at key [test];
Utilisez cette bibliothèque: https://github.com/lukas-krecan/JsonUnit
Pom:
IGNORING_ARRAY_ORDER - ignore l'ordre dans les tableaux
la source
Si vous utilisez déjà JUnit, la dernière version utilise désormais Hamcrest. Il s'agit d'un cadre de correspondance générique (particulièrement utile pour les tests unitaires) qui peut être étendu pour créer de nouveaux correspondants.
Il existe une petite bibliothèque open source appelée
hamcrest-json
avec des correspondances compatibles avec JSON. Il est bien documenté, testé et pris en charge. Voici quelques liens utiles:Exemple de code utilisant des objets de la bibliothèque JSON
org.json.simple
:Facultativement, vous pouvez (1) autoriser les tableaux "de n'importe quel ordre" et (2) ignorer les champs supplémentaires.
Comme il existe une variété de bibliothèques JSON pour Java (
Jackson
,GSON
,json-lib
, etc.), il est utile que leshamcrest-json
supports texte JSON (commejava.lang.String
), des objets ainsi que nativement l' appui de la bibliothèque JSON de Douglas Crockfordorg.json
.Enfin, si vous n'utilisez pas JUnit, vous pouvez utiliser Hamcrest directement pour les assertions. ( J'ai écrit à ce sujet ici. )
la source
Vous pouvez essayer JsonUnit . Il peut comparer deux objets JSON et signaler les différences. Il est construit sur Jackson.
Par exemple
Résulte en
la source
Une chose que j'ai faite et cela fonctionne à merveille est de lire les deux objets dans HashMap puis de les comparer avec un assertEquals () normal. Il appellera la méthode equals () des hashmaps, qui comparera récursivement tous les objets à l'intérieur (ce seront soit d'autres hashmaps soit un objet à valeur unique comme une chaîne ou un entier). Cela a été fait en utilisant l'analyseur Jackson JSON de Codehaus.
Une approche similaire peut être utilisée si l'objet JSON est un tableau à la place.
la source
J'utilise ceci et fonctionne bien pour moi (avec org.json. *):
la source
Pour org.json, j'ai déployé ma propre solution, une méthode qui se compare aux instances JSONObject. Je n'ai pas travaillé avec des objets JSON complexes dans ce projet, donc je ne sais pas si cela fonctionne dans tous les scénarios. De plus, étant donné que j'utilise ceci dans des tests unitaires, je n'ai pas mis d'effort dans les optimisations. C'est ici:
la source
val1
est nul, vous obtiendrez une exception NullPointerException à partir de ce codeif (!val1.equals(val2)) {
js2
ouinull
ou non quandjs1
n'est pasnull
Vous pouvez utiliser la bibliothèque zjsonpatch , qui présente les informations de diff conformément à RFC 6902 (JSON Patch). Son très facile à utiliser. Veuillez visiter sa page de description pour son utilisation
la source
Je prendrais la bibliothèque à http://json.org/java/ et modifierais la
equals
méthode de JSONObject et JSONArray pour faire un test d'égalité approfondi. Pour vous assurer que cela fonctionne sans ordre de l'ordre des enfants, tout ce que vous avez à faire est de remplacer la carte intérieure par unTreeMap
, ou d'utiliser quelque chose commeCollections.sort()
.la source
Essaye ça:
la source
if (obj1Array.length() != obj2Array.length())
pas que tous les éléments coïncident?Je sais que cela n'est généralement considéré que pour les tests, mais vous pouvez utiliser le comparateur Hamcrest JSONSameJSONAs dans Hamcrest JSON.
Hamcrest JSON SameJSONAs
la source
Le karaté est exactement ce que vous recherchez. Voici un exemple:
(avertissement: dev ici)
la source
Pour comparer jsons, je recommande d'utiliser JSONCompare: https://github.com/fslev/json-compare
la source
Pour ceux comme moi qui souhaitent le faire avec Jackson, vous pouvez utiliser json-unit .
Les erreurs donnent des informations utiles sur le type de non-concordance:
la source
Rien d'autre ne semblait fonctionner correctement, alors j'ai écrit ceci:
la source
Le code suivant sera plus utile pour comparer deux JsonObject, JsonArray, JsonPrimitive et JasonElements.
la source
https://tech.blobcity.com/2018/09/02/json-equals-in-java-to-compare-two-jsons
la source
En regardant les réponses, j'ai essayé JSONAssert mais il a échoué. J'ai donc utilisé Jackson avec zjsonpatch. J'ai posté des détails dans la réponse SO ici .
la source
Cette solution pour moi, fonctionne très bien:
J'espère que cela aidera les autres.
la source