Golang解码/解组JSON中的无效unicode

抗生素:

我正在获取未统一格式的JSON文件。例如,我可以有以下内容:

{"email": "\"[email protected]\""}
{"email": "[email protected]"}
{"name": "m\303\203ead"}

我们可以看到转义字符会出现问题。使用json.Decode

带有:

{"name": "m\303\203ead"}

我得到错误: 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
    }
}

Model

type Model struct {
    Name  string `json:"name" bson:"name"`
    Email string `json:"email" bson:"email"` 
}

我已经尝试了它的几种变体,但是还无法使其正常工作。

所以我的问题是如何轻松处理具有不同编码的JSON数据的解码/解组?知道,我对这些JSON文件没有控制权。

如果您正在阅读本文,无论如何都谢谢您。

OneOfOne:

您可以使用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())
}

编辑:好吧,您可以使用正则表达式,不确定是否对您来说可行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())
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章