gson 比较两个具有相同嵌套结构和相同键但值可以不同的json?

v8wbuo2f  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(205)

例如:

Json A =>
{
  "customer": {
    "age": 29,
    "fullName": "Emily Jenkins",
    "year":1988,
    "address":{
        "lineOne":"lineOne",
        "lineTwo":"lineTwo"
    }
},
  "handset":{
    "phone":"0123456789",
    "colour":"black"
  }
}

Json B =>
    {
      "customer": {
        "fullName": "Sammy J",
        "age": 31,
        "year":1985,
        "address":{
            "lineTwo":"lineTwo",
            "lineOne":"lineOne"
        }
    },
      "handset":{
        "colour":"red",
        "phone":"0123456788"
      }
    }

我想比较这两个json,它应该返回true,因为键是匹配的,两个json结构是相同的。那么有没有一个干净的方法来做呢?
我知道使用Gson库我可以比较两个JsonElement,但这也会匹配我不想作为用例约束保留的值。

JsonParser parser = new JsonParser();
JsonElement p1 = parser.parse(JsonA);
JsonElement p2 = parser.parse(JsonB);
System.out.printf(p1.equals(p2) ? "Equal" : "Not Equal"); //it returns true if values are same.
ngynwnxp

ngynwnxp1#

这确实是JSON模式验证的一个案例,请参阅核心和验证。
有几个JSON模式验证器可用,在下面的例子中,我使用enter link description here。库的二进制文件在Maven中可用,它也可以下载(沿着所有依赖项和javadoc)from here。其他验证器也可以从这里获得。
通过this guide也许会有帮助。
此示例的Schema如下所示(SampleJsonSchema.json):

{
    "$schema":"http://json-schema.org/draft-07/schema#",
    "id":"http://test.org/sampleJsonSchema1",

    "title":"SampleJSONSchema",

    "description":"This is the description",

    "type":"object",

    "properties":{

        "customer":{

            "type":"object",
            "properties":{

                "fullname":{"type":"string"},
                "age":{"type":"integer"},
                "year":{"type":"integer"},
                "address":{

                    "type":"object",
                    "properties":{

                        "lineOne":{"type":"string"},
                        "lineTwo":{"type":"string"}

                    },

                    "required":["lineOne", "lineTwo"],
                    "maxProperties":2

                }

            },

            "required":["fullname","age","year","address"],
            "maxProperties":4   

        },

        "handset":{

            "type":"object",
            "properties":{

                "phone":{"type":"string"},
                "colour":{"type":"string"}

            },

            "required":["phone","colour"],
            "maxProperties":2

        }

    }
}

使用的数据如下(SampleJsonData.json:

{
  "customer": {

   "fullname": "Emily Jenkins",
    "age": 29,
    "year":1988,

    "address":{

        "lineOne":"lineOne",
        "lineTwo":"lineTwo"
    }
},
  "handset":{
    "phone":"0123456789",
    "colour":"black"
  }
}

验证程序如下:
Package 组织试验;

import java.io.File;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.fge.jsonschema.core.report.ProcessingReport;
import com.github.fge.jsonschema.main.JsonSchema;
import com.github.fge.jsonschema.main.JsonSchemaFactory;

public class JsonValidation {

    public static void main(String[] args) throws Exception{

        String jsonSchemaPath="F:\\workspaces\\utilities\\TestJava\\jsonSchema\\SampleJsonSchema.json";
        String jsonDataPath="F:\\workspaces\\utilities\\TestJava\\jsonSchema\\SampleJsonData.json";

        ObjectMapper mapper=new ObjectMapper();

        JsonNode schemaNode=mapper.readValue(new File(jsonSchemaPath), JsonNode.class);
        JsonNode dataNode=mapper.readValue(new File(jsonDataPath), JsonNode.class);

        JsonSchema jsonSchema=JsonSchemaFactory.byDefault().getJsonSchema(schemaNode);

        ProcessingReport validationReport=jsonSchema.validate(dataNode);

        System.out.println(validationReport.toString());

    }//main closing

}//class closing

可以通过更改架构和数据来运行许多测试,以观察不同的结果。

相关问题