我正在获取未统一格式的JSON文件。例如,我可以有以下内容:
{"email": "\"blah.blah@blah.com\""}
{"email": "robert@gmail.com"}
{"name": "m\303\203ead"}
Run Code Online (Sandbox Code Playgroud)
我们可以看到转义字符会出现问题。使用json.Decode:
带有:
{"name": "m\303\203ead"}
Run Code Online (Sandbox Code Playgroud)
我得到错误: invalid character '3' in string escape code
我尝试了几种方法来规范我的数据,例如通过传递一个字符串数组(它可以工作,但是存在太多的边缘情况),甚至过滤转义字符。
最后,我看了这篇文章:(http://blog.golang.org/normalization)他们提出的解决方案似乎非常有趣。
我尝试了以下
isMn := func(r rune) bool {
return unicode.Is(unicode.Mn, r)
}
t := transform.Chain(norm.NFC, transform.RemoveFunc(isMn), norm.NFD)
fileReader, err := bucket.GetReader(filename)
transformReader := transform.NewReader(fileReader, t)
decoder := json.NewDecoder(tReader)
for {
var dataModel Model
if err := decoder.Decode(&kmData); err == io.EOF {
break
} else {
// DO SOMETHING
}
}
Run Code Online (Sandbox Code Playgroud)
与Model:
type Model struct {
Name string `json:"name" bson:"name"`
Email string `json:"email" bson:"email"`
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了它的几种变体,但是还无法使其正常工作。
所以我的问题是如何轻松处理使用不同编码的解码/解组JSON数据?知道,我对这些JSON文件没有控制权。
如果您正在阅读本文,无论如何都谢谢您。
您可以使用json.RawMessage代替string,这样就json.Decode不会尝试解码无效字符。
游乐场: http: //play.golang.org/p/fB-38KGAO0
type Model struct {
N json.RawMessage `json:"name" bson:"name"`
}
func (m *Model) Name() string {
return string(m.N)
}
func main() {
s := "{\"name\": \"m\303\203ead\"}"
r := strings.NewReader(s)
d := json.NewDecoder(r)
m := Model{}
fmt.Println(d.Decode(&m))
fmt.Println(m.Name())
}
Run Code Online (Sandbox Code Playgroud)
编辑:嗯,您可以使用正则表达式,不确定这对您来说有多可行http://play.golang.org/p/VYJKTKmiYm:
func cleanUp(s string) string {
re := regexp.MustCompile(`\b(\\\d\d\d)`)
return re.ReplaceAllStringFunc(s, func(s string) string {
return `\u0` + s[1:]
})
}
func main() {
s := "{\"name\": \"m\303\203ead\"}"
s = cleanUp(s)
r := strings.NewReader(s)
d := json.NewDecoder(r)
m := Model{}
fmt.Println(d.Decode(&m))
fmt.Println(m.Name())
}
Run Code Online (Sandbox Code Playgroud)