遇到的问题:
在处理接口数据时,json.Unmarshal 报错提示:invalid character '\x0f' after top-level value { 0}
。原因是json字符串末尾有隐藏的制表符。
网上搜索到的方案有正则匹配替换、json.Compact 压缩,都不生效。
示例代码如下:
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Age int64
}
func main() {
var u User
jsonstr := `{"name": "Wil", "age": 12}���` // 字符串末尾有隐藏的制表符,ASCII码为 15
jsonbytes := []byte(jsonstr)
err := json.Unmarshal(jsonbytes, &u)
fmt.Println(err, u)
}
解决方案
隐藏字符的ASCII码为 0-31,127 , 逐个循环字符进行过滤。
func TrimHiddenCharacter(originStr string) string {
srcRunes := []rune(originStr)
dstRunes := make([]rune, 0, len(srcRunes))
for _, c := range srcRunes {
if c >= 0 && c <= 31 {
continue
}
if c == 127 {
continue
}
dstRunes = append(dstRunes, c)
}
return string(dstRunes)
}
// main方法中调用函数处理特殊隐藏字符
jsonstr = TrimHiddenCharacter(jsonstr)
参考
ASCII码隐藏字符图