As a general design point, I normally advise against letting dependencies on a distinct serialization format bleed out beyond your storage/networking layer; thus, I'd first suggest that you consider examining equality between your application objects willingly than their JSON manifestations.
Having said that, I'm currently a big fan of Jackson which my timely read of their ObjectNode.equals() implementation hints does the set membership association that you want:
public boolean equals(Object o)
{
if (o == this) return true;
if (o == null) return false;
if (o.getClass() != getClass()) {
return false;
}
ObjectNode other = (ObjectNode) o;
if (other.size() != size()) {
return false;
}
if (_children != null) {
for (Map.Entry<String, JsonNode> en : _children.entrySet()) {
String key = en.getKey();
JsonNode value = en.getValue();
JsonNode otherValue = other.get(key);
if (otherValue == null || !otherValue.equals(value)) {
return false;
}
}
}
return true;
}