obj==null和obj.isEmpty()还有"".equals()有什么区别,equals

判空技巧详解
本文深入探讨了Java中对象为空(IsNull)与值为空(IsEmpty)的区别,并通过实例演示了如何使用null检查及IsEmpty方法来避免NullPointerException,同时对比了不同场景下它们的应用。
1.一个是对象为Null(堆内存中无被指向的对象地址,IsNull),一个是值为空(IsEmpty)

obj==null:
功能:返回Boolean的值,指明表达是否不包含任何有效数据。NULL表示的是数据值未知或不可用,它不表示零(数字值或二进制值)、零长度的字符串或空白(字符值);

obj.isEmpty():
功能:用于判断一个变量是否已初始化,如果变量未初始化或显式地设置为Empty,则函数IsEmpty返回True;否则函数返回False;

如果obj是null的话调用obj.isEmpty() 
抛NullpointException 
因为那个时候JDK不知道obj是什么东西,所以根本没办法调用

这就相当与,你要喝水,
isNull就是判断是不是连水杯都没有
isEmpty就是判断水杯里面没有水

object.equals(object):
" ".equals(object):
左边不能出现为空的情况,不然会抛NullpointException
" "这个不是null值,他代表一个空格字符串
如下有代码验证:
package cn.lz.life.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Test {
	
	private static final Logger log = LoggerFactory.getLogger(Test.class);
	
	public static void main(String[] args) {
		String a = new String();
		String b = "";
		String c = null;

		if (a == null) {
			log.info("a***************isNull");
		}
		if (a.isEmpty()) {
			log.info("a***************isEmpty");
		}
		if ("".equals(a)) {
			log.info("a***************空字符串");
		}
		
		if (b == null) {
			log.info("b***************isNull");
		}
		if (b.isEmpty()) {
			log.info("b***************isEmpty");
		}
		if ("".equals(b)) {
			log.info("b***************空字符串");
		}
		
		if (c == null) {
			log.info("c***************isNull");
		}
		if (c.isEmpty()) {
			log.info("c***************isEmpty");
		}
		if ("".equals(c)) {
			log.info("c***************空字符串");
		}
	}
	
}

控制台打印:
13:49:44.129 [main] INFO cn.lz.life.util.Test - a***************isEmpty
13:49:44.137 [main] INFO cn.lz.life.util.Test - a***************空字符串
13:49:44.137 [main] INFO cn.lz.life.util.Test - b***************isEmpty
13:49:44.137 [main] INFO cn.lz.life.util.Test - b***************空字符串
13:49:44.137 [main] INFO cn.lz.life.util.Test - c***************isNull
可以看出:
a局部变量有可指向的对象,对象不为null,但对象的值为空,默认值为“ ”空字符串;
a局部变量有可指向的对象,对象不为null,但对象的值为空,被赋值为“ ”空字符串;
c局部变量无可指向的对象;




                
public static List<Map<String, String>> getInventoryStatisticsListMap(List<EscrowLedgerVO> list, String inventoryCategory) { List<Map<String, String>> listMap = new ArrayList<Map<String, String>>(); int no = 0; for (EscrowLedgerVO ledgerVO : list) { no += 1; Map<String, String> lm = new HashMap<String, String>(); lm.put("no", String.valueOf(no)); lm.put("parentCategoryName", ledgerVO.getParentCategoryName()); lm.put("categoryName", ledgerVO.getCategoryName()); lm.put("childCategoryName", ledgerVO.getChildCategoryName()); lm.put("name", ledgerVO.getStandardAsset() != null ? ledgerVO.getStandardAsset().getName() : ""); lm.put("model", ledgerVO.getStandardAsset() != null ? ledgerVO.getStandardAsset().getModel() : ""); lm.put("manufacturer", ledgerVO.getStandardAsset().getManufacturer() != null ? ledgerVO.getStandardAsset().getManufacturer().getName() : ""); lm.put("unit", ledgerVO.getStandardAsset() != null ? ledgerVO.getStandardAsset().getUnit() : ""); lm.put("userDept", ledgerVO.getUseDept()); lm.put("managementDept", ledgerVO.getManagementDept() != null ? ledgerVO.getManagementDept().getName() : ""); lm.put("user", ledgerVO.getUsePerson()); lm.put("position", ledgerVO.getPosition() != null ? ledgerVO.getPosition().getName() : ""); lm.put("originalValue", ledgerVO.getOriginalValue().stripTrailingZeros().toPlainString()); lm.put("num", String.valueOf(ledgerVO.getNum())); String firstInventoryNum = ""; String secondInventoryNum = ""; String inventoryWinAndLossNum = ""; if (ledgerVO.getFirstInventoryType().equals("0")) { firstInventoryNum = ""; inventoryWinAndLossNum = ""; } else if (ledgerVO.getFirstInventoryType().equals("1")) { firstInventoryNum = String.valueOf(ledgerVO.getFirstInventoryNum()); inventoryWinAndLossNum = String.valueOf(ledgerVO.getFirstInventoryWinAndLossNum()); } else if (ledgerVO.getFirstInventoryType().equals("2")) { firstInventoryNum = String.valueOf(ledgerVO.getFirstInventoryNum()); if (ledgerVO.getSecondInventoryWinAndLossNum() < 0) { inventoryWinAndLossNum = String.valueOf(ledgerVO.getSecondInventoryWinAndLossNum()); } else { inventoryWinAndLossNum = "-" + ledgerVO.getSecondInventoryWinAndLossNum(); } } else if (ledgerVO.getFirstInventoryType().equals("3")) { firstInventoryNum = String.valueOf(ledgerVO.getFirstInventoryNum()); inventoryWinAndLossNum = "+" + ledgerVO.getFirstInventoryWinAndLossNum(); } //当导出复盘统计数据时,添加复盘数量 if (inventoryCategory ==null || inventoryCategory.equals("1")) { if (ledgerVO.getSecondInventoryType().equals("0") || (ledgerVO.getSecondInventoryNum() == 0 && ledgerVO.getSecondInventoryWinAndLossNum() == 0)) { secondInventoryNum = ""; } else if (ledgerVO.getSecondInventoryType().equals("1")) { secondInventoryNum = String.valueOf(ledgerVO.getSecondInventoryNum()); inventoryWinAndLossNum = String.valueOf(ledgerVO.getSecondInventoryWinAndLossNum()); } else if (ledgerVO.getSecondInventoryType().equals("2")) { secondInventoryNum = String.valueOf(ledgerVO.getSecondInventoryNum()); if (ledgerVO.getSecondInventoryWinAndLossNum() < 0) { inventoryWinAndLossNum = String.valueOf(ledgerVO.getSecondInventoryWinAndLossNum()); } else { inventoryWinAndLossNum = "-" + ledgerVO.getSecondInventoryWinAndLossNum(); } } else if (ledgerVO.getSecondInventoryType().equals("3")) { secondInventoryNum = String.valueOf(ledgerVO.getSecondInventoryNum()); inventoryWinAndLossNum = "+" + ledgerVO.getSecondInventoryWinAndLossNum(); } } lm.put("firstInventoryNum", firstInventoryNum); lm.put("firstInventoryWinAndLossNum", ledgerVO.getFirstInventoryWinAndLossNum().toString()); lm.put("secondNum", ledgerVO.getSecondInventoryNum() == null ? "" : String.valueOf(ledgerVO.getNum())); lm.put("inventoryWinAndLossNum", inventoryWinAndLossNum); lm.put("secondInventoryNum", ledgerVO.getSecondInventoryNum() == null ? "" : secondInventoryNum); lm.put("secondInventoryWinAndLossNum", ledgerVO.getSecondInventoryNum() == null ? "" : ledgerVO.getSecondInventoryWinAndLossNum().toString()); lm.put("remarks", ledgerVO.getRemarks()); listMap.add(lm); } return listMap; } 这是我导出数据的代码,现在需要添加汇总的代码,该如何做
最新发布
09-18
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; 完整代码 不要思考过程
08-28
package com.sjsemi.util; import com.sjsemi.common.utils.FormatUtils; import lombok.var; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; import java.beans.Introspector; import java.lang.reflect.Field; import java.util.stream.Collectors; import javax.persistence.Column; import javax.persistence.Table; import javax.persistence.Id; public class BeanMapper { /** * 动态映射数据库记录到目标对象 * * @param target 目标对象 * @param record 数据库记录 */ public static void mapFields(Object target, Map<String, Object> record) { try { var beanInfo = Introspector.getBeanInfo(target.getClass()); for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) { if ("class".equals(pd.getName())) continue; var setter = pd.getWriteMethod(); if (setter == null) continue; // 获取字段对象 Field field = null; try { field = target.getClass().getDeclaredField(pd.getName()); } catch (NoSuchFieldException e) { continue; // 跳过不存在的字段 } // 检查@Column注解 Column columnAnnotation = field.getAnnotation(Column.class); String columnName; if (columnAnnotation != null) { columnName = columnAnnotation.name(); // 使用注解指定的列名 } else { columnName = toColumnName(pd.getName()); // 默认转换 } // 获取值并转换 var value = record.get(columnName); var convertedValue = convertValue(value, pd.getPropertyType()); if (convertedValue != null) { setter.invoke(target, convertedValue); } } } catch (Exception e) { e.printStackTrace(); } } /** * 将对象转换为参数Map */ public static Map<String, Object> toParamMap(Object entity) { Map<String, Object> paramMap = new HashMap<>(); try { BeanInfo beanInfo = Introspector.getBeanInfo(entity.getClass()); for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) { if ("class".equals(pd.getName())) continue; Method readMethod = pd.getReadMethod(); if (readMethod == null) continue; // 获取对应的字段(Field) Field field = null; try { field = entity.getClass().getDeclaredField(pd.getName()); } catch (NoSuchFieldException e) { continue; // 如果找不到字段,跳过 } // 检查是否有@Column注解 Column columnAnnotation = field.getAnnotation(Column.class); String key; if (columnAnnotation != null) { key = columnAnnotation.name(); // 使用列名作为键 } else { key = pd.getName(); // 如果没有注解,使用属性名 } Object value = readMethod.invoke(entity); if (value != null && (!(value instanceof String) || !((String) value).trim().isEmpty())) { paramMap.put(key, value); } } } catch (Exception e) { throw new RuntimeException(e); } return paramMap; } /** * 类型转换工具 */ private static Object convertValue(Object value, Class<?> targetType) { if (value == null) { if (targetType == String.class) { return ""; } else if (targetType == Integer.TYPE || targetType == Integer.class) { return 0; } else if (targetType == Boolean.TYPE || targetType == Boolean.class) { return false; } return null; } if (targetType == String.class) { return FormatUtils.parseString(value); } else if (targetType == Integer.TYPE || targetType == Integer.class) { return FormatUtils.parseInteger(value); } return value; } /** * 将属性名转换为数据库列名 */ private static String toColumnName(String propertyName) { if (propertyName == null || propertyName.isEmpty()) { return propertyName; } return propertyName; } public static String getTableName(Class<?> entityType) { Table table = entityType.getAnnotation(Table.class); if (table != null) { return table.name(); } return entityType.getSimpleName().toLowerCase() + "s"; } public static List<String> getColumnNames(Class<?> entityType) { try { PropertyDescriptor[] pds = Introspector.getBeanInfo(entityType).getPropertyDescriptors(); return Arrays.stream(pds) .filter(pd -> !"class".equals(pd.getName())) .map(pd -> toColumnName(pd.getName())) .collect(Collectors.toList()); } catch (IntrospectionException e) { throw new RuntimeException(e); } } public static List<String> getPrimaryKeys(Class<?> entityType) { List<String> keys = new ArrayList<>(); for (Field field : entityType.getDeclaredFields()) { if (field.isAnnotationPresent(Id.class)) { // 检查 @Id 注解 Column column = field.getAnnotation(Column.class); String columnName = column != null && !column.name().isEmpty() ? column.name() : toColumnName(field.getName()); keys.add(columnName); } } return keys; } /** * 生成INSERT语句 */ public static String buildInsertSql(Class<?> entityType) { String tableName = getTableName(entityType); List<String> columns = getColumnNames(entityType); String columnsStr = String.join(", ", columns); String paramsStr = columns.stream().map(c -> ":" + c).collect(Collectors.joining(", ")); return String.format("INSERT INTO %s (%s) VALUES (%s)", tableName, columnsStr, paramsStr); } /** * 生成UPDATE语句 */ public static String buildUpdateSql(Class<?> entityType) { String tableName = getTableName(entityType); List<String> columns = getColumnNames(entityType); List<String> primaryKeys = getPrimaryKeys(entityType); // 过滤掉主键字段,仅保留非主键字段在 SET 子句 List<String> nonPrimaryKeyColumns = columns.stream() .filter(c -> !primaryKeys.contains(c)) .collect(Collectors.toList()); String setClause = nonPrimaryKeyColumns.stream() .map(c -> c + " = :" + c) .collect(Collectors.joining(", ")); String whereClause = primaryKeys.stream() .map(c -> c + " = :" + c) .collect(Collectors.joining(" AND ")); return String.format("UPDATE %s SET %s WHERE %s", tableName, setClause, whereClause); } /** * 生成DELETE语句 */ public static String buildDeleteSql(Class<?> entityType) { String tableName = getTableName(entityType); List<String> primaryKeys = getPrimaryKeys(entityType); List<String> whereClauses = primaryKeys.stream().map(c -> c + " = :" + c).collect(Collectors.toList()); String whereClause = String.join(" AND ", whereClauses); return String.format("DELETE FROM %s WHERE %s", tableName, whereClause); } /** * 生成基础SELECT语句 */ public static String buildSelectSql(Class<?> entityType) { String tableName = getTableName(entityType); List<String> columns = getColumnNames(entityType); String columnsStr = String.join(", ", columns); return String.format("SELECT %s FROM %s", columnsStr, tableName); } /** * 生成带WHERE条件的COUNT语句 */ public static String buildCountSql(Class<?> entityType, String whereClause) { return String.format("SELECT COUNT(*) FROM %s WHERE %s", getTableName(entityType), whereClause); } /** * 生成分页SQL */ public static String buildPagedSql(String innerSql) { return String.format( "SELECT t.* FROM (SELECT rownum row_num, t.* FROM (%s) t WHERE rownum <= :END_INDEX) t WHERE t.row_num >= :START_INDEX", innerSql ); } /** * 根据实体对象生成WHERE条件 */ public static String buildWhereClause(Class<?> entityType, Object entity) { try { PropertyDescriptor[] pds = Introspector.getBeanInfo(entityType).getPropertyDescriptors(); List<String> conditions = Arrays.stream(pds) .filter(pd -> !"class".equals(pd.getName())) .map(pd -> { String propertyName = pd.getName(); try { // 获取字段并检查@Column注解 Field field = entityType.getDeclaredField(propertyName); Column column = field.getAnnotation(Column.class); String columnName = column != null ? column.name() : toColumnName(propertyName); // 获取属性值并判断是否有效 Object value = pd.getReadMethod().invoke(entity); if (value == null) return null; if (value instanceof String && ((String) value).trim().isEmpty()) return null; // 生成条件表达式 return columnName + " = :" + columnName; } catch (NoSuchFieldException | IllegalAccessException | InvocationTargetException e) { return null; } }) .filter(Objects::nonNull) .collect(Collectors.toList()); // 拼接最终的WHERE条件 return conditions.isEmpty() ? "1=1" : "1=1 AND " + String.join(" AND ", conditions); } catch (Exception e) { throw new RuntimeException("Failed to build where clause", e); } } /** * 通用方法:去除对象中所有 String 类型字段的左右空格换行符 * * @param obj 待处理的对象 */ public static void objectTrim(Object obj) { if (obj == null) { return; } Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.getType() == String.class) { field.setAccessible(true); try { String value = (String) field.get(obj); if (value != null) { // 使用正则去除左右空格换行符 String cleaned = value.replaceAll("^\\s+|\\s+$", ""); field.set(obj, cleaned); } } catch (IllegalAccessException e) { e.printStackTrace(); } } } } } buildInsertSql改成动态生成SQL语句,而不是固定根据表的字段创建,需要表有值才能去创建,当前传值为: hbmMaterialHist = {HbmMaterialHist@6162} “HbmMaterialHist(materialName=, matType=A, custDeviceId=Q3303016SD111, sapMaterialNo=QX26A, custLotId=3CJA179UAN, total=null, issuanceUser=null, pickingUser=null, returnUser=null, operateTime=Wed Sep 10 11:14:44 GMT+08:00 2025, used=null, residue=null, status=U, sjLotId=null, exFactoryTime=null, confirmCustLotId=null, remark=Test, feedUser=null, feedTime=null, confirmTime=null, updateTime=null, dateCode=20)” materialName = “” matType = “A” custDeviceId = “Q3303016SD111” sapMaterialNo = “QX26A” custLotId = “3CJA179UAN” total = null issuanceUser = null pickingUser = null returnUser = null operateTime = {Date@6177} “Wed Sep 10 11:14:44 GMT+08:00 2025” used = null residue = null status = “U” sjLotId = null exFactoryTime = null confirmCustLotId = null remark = “Test” feedUser = null feedTime = null confirmTime = null updateTime = null dateCode = “20”
09-11
String dbVin = Optional.ofNullable(publicService.selectObj("H_VEH_INFO", "", "jylsh,testtimes", new HVehInfo().setJylsh(sbzp1.getJylsh()) .setTesttimes(Integer.valueOf(sbzp1.getTesttimes()))) .getVin()).orElse("").replaceAll("[^A-Za-z0-9]", "").toUpperCase(); 这个写法报错请在我的代码基础上修改:public void vinZPyj (HDataBase hDataBase){ // 车架号识别预警 if (QueryWarn("2024091801", hDataBase.getTsno())) { log.debug("车架号识别预警"); // 识别痕迹照片 DtoDSB01In sbzp1 = publicService.selectObj("select top 1 * from DSB01 where sblx ='04' and jylsh='" + hDataBase.getJylsh() + "' and testtimes=" + hDataBase.getTesttimes(), DtoDSB01In.class); if (sbzp1.getSblx().equals("04")) { if (null == hDataBase.getSfcjhyj() || hDataBase.getSfcjhyj().equals("")) { hDataBase.setSfcjhyj("0"); } com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(sbzp1.getSbjg()); // 安全获取jg1字段并处理nullObject jg1Obj = jsonObject.get("jg1"); String vinStr = (jg1Obj != null) ? jg1Obj.toString() : ""; HVehInfo vehInfo = new HVehInfo(); vehInfo.setJylsh(sbzp1.getJylsh()); vehInfo.setTesttimes(Integer.valueOf(sbzp1.getTesttimes())); vehInfo = publicService.selectObj("H_VEH_INFO", "", "jylsh,testtimes", vehInfo); // 处理数据库VIN为null的情况 String dbVinStr = (vehInfo.getVin() != null) ? vehInfo.getVin() : ""; String aiVin = vinStr.toUpperCase().trim(); // 去除前后空格并转大写 String dbVin = dbVinStr.toUpperCase().trim(); // 空值检查 // if (aiVin.isEmpty() || dbVin.isEmpty()) { // updateYjnr("车架号为空", hDataBase, "2024091801"); // hDataBase.setSfcjhyj("1"); // return; // } int matchCount = 0; // 动态比较最小长度,但总长度按17位计算 for (int i = 0; i < 17; i++) { // 检查当前索引是否在两个VIN的范围内 boolean aiCharPresent = i < aiVin.length(); boolean dbCharPresent = i < dbVin.length(); if (aiCharPresent && dbCharPresent) { if (aiVin.charAt(i) == dbVin.charAt(i)) { matchCount++; } } // 其他情况视为不匹配,不计入匹配数 } double similarity = (double) matchCount / 17; // 判断相似度阈值(80%) if (similarity < 0.3) { // log.debug(hDataBase.getJylsh() + "车架号相似度低于60%,不一致"); updateYjnr("AI识别车架号结果登记车架号不一致", hDataBase, "2024091801"); hDataBase.setSfcjhyj("1"); log.debug("是否车架号预警:" + hDataBase.getSfcjhyj()); } else { log.debug(hDataBase.getJylsh() + "车架号识别一致"); } } publicService.update("h_data_base", "", "jylsh,testtimes", hDataBase); } }
03-22
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值