public class JsonValidator {
/**
* 主校验方法(直接使用 JSONObject 参数)
* @param json1 第一个 JSON 对象
* @param json2 第二个 JSON 对象
* @return 校验结果(错误信息列表)
*/
public static List<String> validate(JSONObject json1, JSONObject json2) {
List<String> errors = new ArrayList<>();
validateStructure(json1, json2, "$", errors);
return errors;
}
/**
* 递归校验 JSON 结构
*/
private static void validateStructure(Object obj1, Object obj2, String path, List<String> errors) {
// 1. 空值检查(优先处理)
if (isEmptyValue(obj1)) {
errors.add(path + " (JSON1) 存在空值");
}
if (isEmptyValue(obj2)) {
errors.add(path + " (JSON2) 存在空值");
}
// 2. 类型一致性检查
if (!isSameType(obj1, obj2)) {
errors.add(path + " 类型不一致: " +
getTypeName(obj1) + " vs " + getTypeName(obj2));
return;
}
// 3. 递归处理嵌套结构
if (obj1 instanceof JSONObject) {
validateObject((JSONObject) obj1, (JSONObject) obj2, path, errors);
} else if (obj1 instanceof JSONArray) {
validateArray((JSONArray) obj1, (JSONArray) obj2, path, errors);
}
}
/**
* 校验 JSON 对象
*/
private static void validateObject(JSONObject obj1, JSONObject obj2, String path, List<String> errors) {
Set<String> keys1 = obj1.keySet();
Set<String> keys2 = obj2.keySet();
// Key 集合检查(核心逻辑)
if (!keys1.equals(keys2)) {
Set<String> missingIn1 = new HashSet<>(keys2);
missingIn1.removeAll(keys1);
Set<String> missingIn2 = new HashSet<>(keys1);
missingIn2.removeAll(keys2);
if (!missingIn1.isEmpty()) {
errors.add(path + " (JSON1) 缺少Key: " + missingIn1);
}
if (!missingIn2.isEmpty()) {
errors.add(path + " (JSON2) 缺少Key: " + missingIn2);
}
}
// 递归校验每个 Key
for (String key : keys1) {
if (obj2.has(key)) {
String newPath = path + "." + key;
try {
validateStructure(
obj1.get(key),
obj2.get(key),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
}
/**
* 校验 JSON 数组
*/
private static void validateArray(JSONArray arr1, JSONArray arr2, String path, List<String> errors) {
// 数组长度检查
if (arr1.length() != arr2.length()) {
errors.add(path + " 数组长度不一致: " +
arr1.length() + " vs " + arr2.length());
return;
}
// 递归校验每个元素
for (int i = 0; i < arr1.length(); i++) {
String newPath = path + "[" + i + "]";
try {
validateStructure(
arr1.get(i),
arr2.get(i),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
/**
* 空值检测逻辑
*/
private static boolean isEmptyValue(Object obj) {
if (obj == null || JSONObject.NULL.equals(obj)) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
if (obj instanceof JSONArray) {
return ((JSONArray) obj).isEmpty();
}
if (obj instanceof JSONObject) {
return ((JSONObject) obj).isEmpty();
}
return false;
}
/**
* 类型一致性检查
*/
private static boolean isSameType(Object obj1, Object obj2) {
return getTypeName(obj1).equals(getTypeName(obj2));
}
private static String getTypeName(Object obj) {
if (obj == null) return "null";
if (obj instanceof JSONObject) return "object";
if (obj instanceof JSONArray) return "array";
if (obj instanceof String) return "string";
if (obj instanceof Number) return "number";
if (obj instanceof Boolean) return "boolean";
return "unknown";
}
}
public class JsonValidator {
/**
* 主校验方法(直接使用 JSONObject 参数)
* @param json1 第一个 JSON 对象
* @param json2 第二个 JSON 对象
* @return 校验结果(错误信息列表)
*/
public static List<String> validate(JSONObject json1, JSONObject json2) {
List<String> errors = new ArrayList<>();
validateStructure(json1, json2, "$", errors);
return errors;
}
/**
* 递归校验 JSON 结构
*/
private static void validateStructure(Object obj1, Object obj2, String path, List<String> errors) {
// 1. 空值检查(优先处理)
if (isEmptyValue(obj1)) {
errors.add(path + " (JSON1) 存在空值");
}
if (isEmptyValue(obj2)) {
errors.add(path + " (JSON2) 存在空值");
}
// 2. 类型一致性检查
if (!isSameType(obj1, obj2)) {
errors.add(path + " 类型不一致: " +
getTypeName(obj1) + " vs " + getTypeName(obj2));
return;
}
// 3. 递归处理嵌套结构
if (obj1 instanceof JSONObject) {
validateObject((JSONObject) obj1, (JSONObject) obj2, path, errors);
} else if (obj1 instanceof JSONArray) {
validateArray((JSONArray) obj1, (JSONArray) obj2, path, errors);
}
}
/**
* 校验 JSON 对象
*/
private static void validateObject(JSONObject obj1, JSONObject obj2, String path, List<String> errors) {
Set<String> keys1 = obj1.keySet();
Set<String> keys2 = obj2.keySet();
// Key 集合检查(核心逻辑)
if (!keys1.equals(keys2)) {
Set<String> missingIn1 = new HashSet<>(keys2);
missingIn1.removeAll(keys1);
Set<String> missingIn2 = new HashSet<>(keys1);
missingIn2.removeAll(keys2);
if (!missingIn1.isEmpty()) {
errors.add(path + " (JSON1) 缺少Key: " + missingIn1);
}
if (!missingIn2.isEmpty()) {
errors.add(path + " (JSON2) 缺少Key: " + missingIn2);
}
}
// 递归校验每个 Key
for (String key : keys1) {
if (obj2.has(key)) {
String newPath = path + "." + key;
try {
validateStructure(
obj1.get(key),
obj2.get(key),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
}
/**
* 校验 JSON 数组
*/
private static void validateArray(JSONArray arr1, JSONArray arr2, String path, List<String> errors) {
// 数组长度检查
if (arr1.length() != arr2.length()) {
errors.add(path + " 数组长度不一致: " +
arr1.length() + " vs " + arr2.length());
return;
}
// 递归校验每个元素
for (int i = 0; i < arr1.length(); i++) {
String newPath = path + "[" + i + "]";
try {
validateStructure(
arr1.get(i),
arr2.get(i),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
/**
* 空值检测逻辑
*/
private static boolean isEmptyValue(Object obj) {
if (obj == null || JSONObject.NULL.equals(obj)) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
if (obj instanceof JSONArray) {
return ((JSONArray) obj).isEmpty();
}
if (obj instanceof JSONObject) {
return ((JSONObject) obj).isEmpty();
}
return false;
}
/**
* 类型一致性检查
*/
private static boolean isSameType(Object obj1, Object obj2) {
return getTypeName(obj1).equals(getTypeName(obj2));
}
private static String getTypeName(Object obj) {
if (obj == null) return "null";
if (obj instanceof JSONObject) return "object";
if (obj instanceof JSONArray) return "array";
if (obj instanceof String) return "string";
if (obj instanceof Number) return "number";
if (obj instanceof Boolean) return "boolean";
return "unknown";
}
}
public class JsonValidator {
/**
* 主校验方法(直接使用 JSONObject 参数)
* @param json1 第一个 JSON 对象
* @param json2 第二个 JSON 对象
* @return 校验结果(错误信息列表)
*/
public static List<String> validate(JSONObject json1, JSONObject json2) {
List<String> errors = new ArrayList<>();
validateStructure(json1, json2, "$", errors);
return errors;
}
/**
* 递归校验 JSON 结构
*/
private static void validateStructure(Object obj1, Object obj2, String path, List<String> errors) {
// 1. 空值检查(优先处理)
if (isEmptyValue(obj1)) {
errors.add(path + " (JSON1) 存在空值");
}
if (isEmptyValue(obj2)) {
errors.add(path + " (JSON2) 存在空值");
}
// 2. 类型一致性检查
if (!isSameType(obj1, obj2)) {
errors.add(path + " 类型不一致: " +
getTypeName(obj1) + " vs " + getTypeName(obj2));
return;
}
// 3. 递归处理嵌套结构
if (obj1 instanceof JSONObject) {
validateObject((JSONObject) obj1, (JSONObject) obj2, path, errors);
} else if (obj1 instanceof JSONArray) {
validateArray((JSONArray) obj1, (JSONArray) obj2, path, errors);
}
}
/**
* 校验 JSON 对象
*/
private static void validateObject(JSONObject obj1, JSONObject obj2, String path, List<String> errors) {
Set<String> keys1 = obj1.keySet();
Set<String> keys2 = obj2.keySet();
// Key 集合检查(核心逻辑)
if (!keys1.equals(keys2)) {
Set<String> missingIn1 = new HashSet<>(keys2);
missingIn1.removeAll(keys1);
Set<String> missingIn2 = new HashSet<>(keys1);
missingIn2.removeAll(keys2);
if (!missingIn1.isEmpty()) {
errors.add(path + " (JSON1) 缺少Key: " + missingIn1);
}
if (!missingIn2.isEmpty()) {
errors.add(path + " (JSON2) 缺少Key: " + missingIn2);
}
}
// 递归校验每个 Key
for (String key : keys1) {
if (obj2.has(key)) {
String newPath = path + "." + key;
try {
validateStructure(
obj1.get(key),
obj2.get(key),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
}
/**
* 校验 JSON 数组
*/
private static void validateArray(JSONArray arr1, JSONArray arr2, String path, List<String> errors) {
// 数组长度检查
if (arr1.length() != arr2.length()) {
errors.add(path + " 数组长度不一致: " +
arr1.length() + " vs " + arr2.length());
return;
}
// 递归校验每个元素
for (int i = 0; i < arr1.length(); i++) {
String newPath = path + "[" + i + "]";
try {
validateStructure(
arr1.get(i),
arr2.get(i),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
/**
* 空值检测逻辑
*/
private static boolean isEmptyValue(Object obj) {
if (obj == null || JSONObject.NULL.equals(obj)) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
if (obj instanceof JSONArray) {
return ((JSONArray) obj).isEmpty();
}
if (obj instanceof JSONObject) {
return ((JSONObject) obj).isEmpty();
}
return false;
}
/**
* 类型一致性检查
*/
private static boolean isSameType(Object obj1, Object obj2) {
return getTypeName(obj1).equals(getTypeName(obj2));
}
private static String getTypeName(Object obj) {
if (obj == null) return "null";
if (obj instanceof JSONObject) return "object";
if (obj instanceof JSONArray) return "array";
if (obj instanceof String) return "string";
if (obj instanceof Number) return "number";
if (obj instanceof Boolean) return "boolean";
return "unknown";
}
}
public class JsonValidator {
/**
* 主校验方法(直接使用 JSONObject 参数)
* @param json1 第一个 JSON 对象
* @param json2 第二个 JSON 对象
* @return 校验结果(错误信息列表)
*/
public static List<String> validate(JSONObject json1, JSONObject json2) {
List<String> errors = new ArrayList<>();
validateStructure(json1, json2, "$", errors);
return errors;
}
/**
* 递归校验 JSON 结构
*/
private static void validateStructure(Object obj1, Object obj2, String path, List<String> errors) {
// 1. 空值检查(优先处理)
if (isEmptyValue(obj1)) {
errors.add(path + " (JSON1) 存在空值");
}
if (isEmptyValue(obj2)) {
errors.add(path + " (JSON2) 存在空值");
}
// 2. 类型一致性检查
if (!isSameType(obj1, obj2)) {
errors.add(path + " 类型不一致: " +
getTypeName(obj1) + " vs " + getTypeName(obj2));
return;
}
// 3. 递归处理嵌套结构
if (obj1 instanceof JSONObject) {
validateObject((JSONObject) obj1, (JSONObject) obj2, path, errors);
} else if (obj1 instanceof JSONArray) {
validateArray((JSONArray) obj1, (JSONArray) obj2, path, errors);
}
}
/**
* 校验 JSON 对象
*/
private static void validateObject(JSONObject obj1, JSONObject obj2, String path, List<String> errors) {
Set<String> keys1 = obj1.keySet();
Set<String> keys2 = obj2.keySet();
// Key 集合检查(核心逻辑)
if (!keys1.equals(keys2)) {
Set<String> missingIn1 = new HashSet<>(keys2);
missingIn1.removeAll(keys1);
Set<String> missingIn2 = new HashSet<>(keys1);
missingIn2.removeAll(keys2);
if (!missingIn1.isEmpty()) {
errors.add(path + " (JSON1) 缺少Key: " + missingIn1);
}
if (!missingIn2.isEmpty()) {
errors.add(path + " (JSON2) 缺少Key: " + missingIn2);
}
}
// 递归校验每个 Key
for (String key : keys1) {
if (obj2.has(key)) {
String newPath = path + "." + key;
try {
validateStructure(
obj1.get(key),
obj2.get(key),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
}
/**
* 校验 JSON 数组
*/
private static void validateArray(JSONArray arr1, JSONArray arr2, String path, List<String> errors) {
// 数组长度检查
if (arr1.length() != arr2.length()) {
errors.add(path + " 数组长度不一致: " +
arr1.length() + " vs " + arr2.length());
return;
}
// 递归校验每个元素
for (int i = 0; i < arr1.length(); i++) {
String newPath = path + "[" + i + "]";
try {
validateStructure(
arr1.get(i),
arr2.get(i),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
/**
* 空值检测逻辑
*/
private static boolean isEmptyValue(Object obj) {
if (obj == null || JSONObject.NULL.equals(obj)) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
if (obj instanceof JSONArray) {
return ((JSONArray) obj).isEmpty();
}
if (obj instanceof JSONObject) {
return ((JSONObject) obj).isEmpty();
}
return false;
}
/**
* 类型一致性检查
*/
private static boolean isSameType(Object obj1, Object obj2) {
return getTypeName(obj1).equals(getTypeName(obj2));
}
private static String getTypeName(Object obj) {
if (obj == null) return "null";
if (obj instanceof JSONObject) return "object";
if (obj instanceof JSONArray) return "array";
if (obj instanceof String) return "string";
if (obj instanceof Number) return "number";
if (obj instanceof Boolean) return "boolean";
return "unknown";
}
}
public class JsonValidator {
/**
* 主校验方法(直接使用 JSONObject 参数)
* @param json1 第一个 JSON 对象
* @param json2 第二个 JSON 对象
* @return 校验结果(错误信息列表)
*/
public static List<String> validate(JSONObject json1, JSONObject json2) {
List<String> errors = new ArrayList<>();
validateStructure(json1, json2, "$", errors);
return errors;
}
/**
* 递归校验 JSON 结构
*/
private static void validateStructure(Object obj1, Object obj2, String path, List<String> errors) {
// 1. 空值检查(优先处理)
if (isEmptyValue(obj1)) {
errors.add(path + " (JSON1) 存在空值");
}
if (isEmptyValue(obj2)) {
errors.add(path + " (JSON2) 存在空值");
}
// 2. 类型一致性检查
if (!isSameType(obj1, obj2)) {
errors.add(path + " 类型不一致: " +
getTypeName(obj1) + " vs " + getTypeName(obj2));
return;
}
// 3. 递归处理嵌套结构
if (obj1 instanceof JSONObject) {
validateObject((JSONObject) obj1, (JSONObject) obj2, path, errors);
} else if (obj1 instanceof JSONArray) {
validateArray((JSONArray) obj1, (JSONArray) obj2, path, errors);
}
}
/**
* 校验 JSON 对象
*/
private static void validateObject(JSONObject obj1, JSONObject obj2, String path, List<String> errors) {
Set<String> keys1 = obj1.keySet();
Set<String> keys2 = obj2.keySet();
// Key 集合检查(核心逻辑)
if (!keys1.equals(keys2)) {
Set<String> missingIn1 = new HashSet<>(keys2);
missingIn1.removeAll(keys1);
Set<String> missingIn2 = new HashSet<>(keys1);
missingIn2.removeAll(keys2);
if (!missingIn1.isEmpty()) {
errors.add(path + " (JSON1) 缺少Key: " + missingIn1);
}
if (!missingIn2.isEmpty()) {
errors.add(path + " (JSON2) 缺少Key: " + missingIn2);
}
}
// 递归校验每个 Key
for (String key : keys1) {
if (obj2.has(key)) {
String newPath = path + "." + key;
try {
validateStructure(
obj1.get(key),
obj2.get(key),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
}
/**
* 校验 JSON 数组
*/
private static void validateArray(JSONArray arr1, JSONArray arr2, String path, List<String> errors) {
// 数组长度检查
if (arr1.length() != arr2.length()) {
errors.add(path + " 数组长度不一致: " +
arr1.length() + " vs " + arr2.length());
return;
}
// 递归校验每个元素
for (int i = 0; i < arr1.length(); i++) {
String newPath = path + "[" + i + "]";
try {
validateStructure(
arr1.get(i),
arr2.get(i),
newPath,
errors
);
} catch (Exception e) {
errors.add(newPath + " 访问错误: " + e.getMessage());
}
}
}
/**
* 空值检测逻辑
*/
private static boolean isEmptyValue(Object obj) {
if (obj == null || JSONObject.NULL.equals(obj)) {
return true;
}
if (obj instanceof String) {
return ((String) obj).isEmpty();
}
if (obj instanceof JSONArray) {
return ((JSONArray) obj).isEmpty();
}
if (obj instanceof JSONObject) {
return ((JSONObject) obj).isEmpty();
}
return false;
}
/**
* 类型一致性检查
*/
private static boolean isSameType(Object obj1, Object obj2) {
return getTypeName(obj1).equals(getTypeName(obj2));
}
private static String getTypeName(Object obj) {
if (obj == null) return "null";
if (obj instanceof JSONObject) return "object";
if (obj instanceof JSONArray) return "array";
if (obj instanceof String) return "string";
if (obj instanceof Number) return "number";
if (obj instanceof Boolean) return "boolean";
return "unknown";
}
}改成基于 com.alibaba.fastjson.JSONObject; 完整代码 不要思考过程