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

JavaWeb 解析非標準 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[] elements = inner.split("\\],\\["); 
// elements[0] = "\"trainwishid\":\"45\""
// elements[1] = "\"trainwishid\":\"47\""

// 3. 解析每個元素
List> result = new ArrayList<>();
for (String elem : elements) {
    // elem 格式: "key":"value"
    String[] kv = elem.split("\":\"");
    // kv[0] = "\"trainwishid"  kv[1] = "45\""
    String key = kv[0].replace("\"", "");
    String value = kv[1].replace("\"", "");
    Map map = new HashMap<>();
    map.put(key, value);
    result.add(map);
}

// 結果: [{trainwishid=45}, {trainwishid=47}]

健壯版本:正則提取鍵值對

Pattern p = Pattern.compile("\"([^\"]+)\"\\s*:\\s*\"([^\"]+)\"");
Matcher m = p.matcher(raw);
List> list = new ArrayList<>();
while (m.find()) {
    Map map = new HashMap<>();
    map.put(m.group(1), m.group(2));
    list.add(map);
}

根治建議:後端輸出標準 JSON

該格式極易因特殊字符、巢狀結構、轉義導致解析失敗。要求後端修改為標準 JSON:

// 正確 JSON
[
  {"trainwishid": "45"},
  {"trainwishid": "47"}
]
// 或
{"list": [{"trainwishid": "45"}, {"trainwishid": "47"}]}
  • 前端直接 JSON.parse / Gson.fromJson / Jackson 解析;
  • 類型安全、異常可追蹤、文檖可生成、生態工具鏈通用。

若無法改動後端:封裝適配器

public class LegacyDataAdapter {
    public static List> parse(String raw) {
        // 實現上述正則解析,統一拋出自定義異常
        // 單元測試覆蓋:空數組、特殊字符、缺鍵、巢狀等
    }
}

總結

**非標準格式用正則/替換分割勉強解析,但極其脆弱**。**第一優先級:推動後端輸出標準 JSON**。若不可改,封裝適配器並編寫完整單元測試,隔離解析邏輯,避免業務代碼耦合「屎山格式」。

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