/jsoncompare

A simple python library for comparing json objects for equivalency and helping developers to quickly spot differences between complex json structures.

Primary LanguagePythonOtherNOASSERTION

Build Status

##Install

pip install json_compare

##Explanation

  • Being able to tell whether or not an arbitrarily nested json blob is the same as another blob can hurt your eyes.
  • Additional complexity comes in when your json array's order doesn't matter.
  • For example, you might have a set in Java that you are going to send over the wire as json. It may be represented as a json array but in actuality, you don't care about the order.
  • When two values are close, use rel_tolerance and abs_tolerance to specify the amount of leeway to provide. Math.isclose documents the specifics.

##Disclaimer This project takes the original jsoncompare and adds a few things. First, I wanted to use this with python 3. I also needed flexibility with numbers. If an number is say 10 off, then it's still close enough for me. I also used rapidjson instead of the builtin json module since it can offer a lot of speed.

Recent Changes

Version    Comments
0.1.1      Orginal Version
0.1.2      Adds support for "contains"
0.1.3      Adds support for Python 3, range for int values, ujson instead of builtin json(for speed)
0.2.0      Adds rapidjson instead of ujson, fixes a comparison issue, all unit tests pass
0.2.8      Using math.isclose

##Examples

from json_compare import json_compare

# Compare respecting each array's order
json_compare.are_same(a, b)

# Compare ignoring each array's order
json_compare.are_same(a, b, True)

# Compare ignoring the value of certain keys
json_compare.are_same(a, b, False, ["datetime", "snacktime"])

# Compare ignoring each array's order and giving number values a 30% leeway
json_compare.are_same(a, b, True, rel_tolerance=.3)

# Contains at least
json_compare.contains(a, b)
# Getting difference traces
from json_compare import json_compare

a = {
    "failureReason" : "Invalid request entity",
    "fieldValidationErrors" : [
        {
            "field" : "normal value 1",
            "reason" : "may not be smelly"
        },
        {
            "field" : "Catalog.name",
            "reason" : "may not be null"
        }
    ]
}
b = {
    "failureReason" : "Invalid request entity",
    "fieldValidationErrors" : [
        {
            "field" : "crazy value 2",
            "reason" : "may not be null"
        },
        {
            "field" : "Catalog.catalogOwner",
            "reason" : "may not be null"
        }
    ]
}
print json_compare.are_same(a, b)[1]

results in:

Reason: Different values
Expected:
  "normal value 1"
Actual:
  "crazy value 2"

Reason: Different values (Check order)
Expected:
  {
      "field": "normal value 1", 
      "reason": "may not be smelly"
  }
Actual:
  {
      "field": "crazy value 2", 
      "reason": "may not be null"
  }

Reason: Different values
Expected:
  [
      {
          "field": "normal value 1", 
          "reason": "may not be smelly"
      }, 
      {
          "field": "Catalog.name", 
          "reason": "may not be null"
      }
  ]
Actual:
  [
      {
          "field": "crazy value 2", 
          "reason": "may not be null"
      }, 
      {
          "field": "Catalog.catalogOwner", 
          "reason": "may not be null"
      }
  ]