首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 後台解析非標準 JSON 陣列:替換分割法提取鍵值對

     編輯:程式設計綜合問答

數據格式

[["trainwishid":"45"],["trainwishid":"47"]]

外層是數組,內層每個元素也是數組,但內層數組只含一個類鍵值對字符串,**非標準 JSON**(標準應為 [{"trainwishid":"45"},{"trainwishid":"47"}])。

解析策略:字符串替換 + 分割(無需引入 JSON 庫)

String raw = "[[\"trainwishid\":\"45\"],[\"trainwishid\":\"47\"]]";

// 1. 去除首尾 [[ ]]
String inner = raw.substring(2, raw.length() - 2);
// 內容: "trainwishid":"45"],["trainwishid":"47"

// 2. 按 "],[" 分割成單條
String[] items = inner.split("\\],\\[");
// items[0] = "\"trainwishid\":\"45\""
// items[1] = "\"trainwishid\":\"47\""

// 3. 每條再按 ":" 分割 key/value
for (String item : items) {
    String[] kv = item.split(":", 2); // 限制分割 2 段,防值含冒號
    String key = kv[0].replace("\"", "");   // trainwishid
    String value = kv[1].replace("\"", ""); // 45
    System.out.println(key + " = " + value);
}

輸出

trainwishid = 45
trainwishid = 47

進階:轉為標準 JSON 再用庫解析(推薦生產環境)

// 1. 修正為標準 JSON
String standardJson = raw
    .replace("[[", "[{")   // [[ -> [{
    .replace("]]", "}]")   // ]] -> }]
    .replace("],[", "},{") // ],[ -> },{
    .replace("\":\"", "\":\""); // 保持鍵值格式
// 結果: [{"trainwishid":"45"},{"trainwishid":"47"}]

// 2. 用 Jackson/Gson/Fastjson 解析
List> list = new ObjectMapper().readValue(standardJson,
    new TypeReference>>() {});
for (Map m : list) {
    System.out.println(m.get("trainwishid"));
}

方案選擇建議

場景推薦方案理由
一次性腳本/數據清洗字符串分割零依賴、代碼短、易理解
生產系統/長期維護修正為標準 JSON + 專業庫健壯、支持嵌套/轉義/類型轉換、可維護
無法修改上游格式自定義解析器封裝分割邏輯為工具類,隔離髒數據影響

避坑提示

  • 原始數據若含轉義引號、換行、Unicode,簡單分割會失效 → 必須用 JSON 庫。
  • 上游若能修改,**強烈要求輸出標準 JSON**,避免下游各自造輪子。
  • 若頻繁遇到非標格式,考慮接入 JsonParser 容錯模式(如 Jackson ALLOW_UNQUOTED_FIELD_NAMES、ALLOW_SINGLE_QUOTES)。

核心觀點:**能用標準 JSON 庫就別手寫解析器**;實在無法改源時,字符串替換分割是應急可行的權宜之計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved