fixLoneBackslashes 把 JSON 字符串里"非合法转义"的反斜杠变成双反斜杠, 解决 Windows 路径(G:\src\x.py)、正则(\d+)把 json.loads 弄坏的问题。 合法转义(\"、\\、\/、\b、\f、\n、\r、\t、\u)保留原样。
(s string)
| 197 | // 解决 Windows 路径(G:\src\x.py)、正则(\d+)把 json.loads 弄坏的问题。 |
| 198 | // 合法转义(\"、\\、\/、\b、\f、\n、\r、\t、\u)保留原样。 |
| 199 | func fixLoneBackslashes(s string) string { |
| 200 | var out strings.Builder |
| 201 | out.Grow(len(s) + 8) |
| 202 | for i := 0; i < len(s); i++ { |
| 203 | c := s[i] |
| 204 | if c != '\\' { |
| 205 | out.WriteByte(c) |
| 206 | continue |
| 207 | } |
| 208 | nxt := byte(0) |
| 209 | if i+1 < len(s) { |
| 210 | nxt = s[i+1] |
| 211 | } |
| 212 | if nxt != 0 && strings.IndexByte(`"\\/bfnrtu`, nxt) >= 0 { |
| 213 | out.WriteByte('\\') |
| 214 | out.WriteByte(nxt) |
| 215 | i++ |
| 216 | continue |
| 217 | } |
| 218 | out.WriteByte('\\') |
| 219 | out.WriteByte('\\') |
| 220 | } |
| 221 | return out.String() |
| 222 | } |
| 223 | |
| 224 | // robustJSON 尽力把一段"看起来像 JSON"的字符串解析成 map[string]any。 |
| 225 | // 依次尝试:反斜杠修复 → 完整解析 → 截取到第一个完整花括号后解析。 |