9 changed files with 186 additions and 22 deletions
@ -0,0 +1,106 @@ |
|||
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 解析工具。 |
|||
* <p> |
|||
* 兼容包对 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<String, Object> 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> T parseObject(String text, Class<T> 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); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue