package com.zdxt.common.util; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; /** * Fastjson2 解析工具。 *

* 兼容包对 String 走 JSONReaderUTF16,在部分 JDK(尤其 Oracle/麒麟 aarch64)上会误报 * {@code invalid escape character EOI}。统一走 UTF-8 字节解析规避该问题,失败时再用 Jackson 兜底。 */ public final class FastJsonUtil { private static final ObjectMapper JACKSON = new ObjectMapper(); private FastJsonUtil() { } public static JSONObject parseObject(String text) { if (text == null) { return null; } String trimmed = text.trim(); if (trimmed.isEmpty() || "null".equalsIgnoreCase(trimmed)) { return null; } try { // 关键 UTF-8 字节路径,避开 JSONReaderUTF16 的 EOI 误判 return JSON.parseObject(trimmed.getBytes(StandardCharsets.UTF_8)); } catch (Exception fastjsonEx) { try { @SuppressWarnings("unchecked") Map map = JACKSON.readValue(trimmed, Map.class); return new JSONObject(map); } catch (Exception jacksonEx) { fastjsonEx.addSuppressed(jacksonEx); if (fastjsonEx instanceof RuntimeException) { throw (RuntimeException) fastjsonEx; } throw new RuntimeException(fastjsonEx); } } } public static JSONArray parseArray(String text) { if (text == null) { return null; } String trimmed = text.trim(); if (trimmed.isEmpty() || "null".equalsIgnoreCase(trimmed)) { return null; } try { Object parsed = JSON.parse(trimmed.getBytes(StandardCharsets.UTF_8)); if (parsed instanceof JSONArray) { return (JSONArray) parsed; } if (parsed == null) { return null; } JSONArray arr = new JSONArray(); arr.add(parsed); return arr; } catch (Exception fastjsonEx) { try { List list = JACKSON.readValue(trimmed, List.class); return new JSONArray(list); } catch (Exception jacksonEx) { fastjsonEx.addSuppressed(jacksonEx); if (fastjsonEx instanceof RuntimeException) { throw (RuntimeException) fastjsonEx; } throw new RuntimeException(fastjsonEx); } } } public static T parseObject(String text, Class clazz) { if (text == null) { return null; } String trimmed = text.trim(); if (trimmed.isEmpty() || "null".equalsIgnoreCase(trimmed)) { return null; } try { return JSON.parseObject(trimmed.getBytes(StandardCharsets.UTF_8), clazz); } catch (Exception fastjsonEx) { try { return JACKSON.readValue(trimmed, clazz); } catch (Exception jacksonEx) { fastjsonEx.addSuppressed(jacksonEx); if (fastjsonEx instanceof RuntimeException) { throw (RuntimeException) fastjsonEx; } throw new RuntimeException(fastjsonEx); } } } }