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

Golang解码/解组JSON中无效的unicode,json,unicode,go,Json,Unicode,Go,我正在go中获取格式不一致的JSON文件。 例如,我可以有以下内容: {"email": "\"blah.blah@blah.com\""} {"email": "robert@gmail.com"} {"name": "m\303\203ead"} 我们可以看到转义字符将出现问题。 使用json.Decode: 与: 我得到错误:字符串转义码中的无效字符“3” 我尝试了几种方法来规范化我的数据,例如通过传递字符串数组(它可以工作,但有太多的边缘情况),甚至过滤转义字符 最后,我看完了这篇文章

我正在go中获取格式不一致的JSON文件。 例如,我可以有以下内容:

{"email": "\"blah.blah@blah.com\""}
{"email": "robert@gmail.com"}
{"name": "m\303\203ead"}
我们可以看到转义字符将出现问题。 使用
json.Decode

与:

我得到错误:
字符串转义码中的无效字符“3”

我尝试了几种方法来规范化我的数据,例如通过传递字符串数组(它可以工作,但有太多的边缘情况),甚至过滤转义字符

最后,我看完了这篇文章:() 他们提出的解决方案似乎非常有趣

我试过以下方法

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
    }
}
型号
为:

type Model struct {
    Name  string `json:"name" bson:"name"`
    Email string `json:"email" bson:"email"` 
}
我试过它的几种变体,但都没有成功

因此,我的问题是如何轻松处理使用不同编码解码/解组JSON数据?我知道,我无法控制这些JSON文件


如果您正在阅读此文章,还是要谢谢您。

您可以使用
json.RawMessage
而不是
string
,这样
json.Decode
就不会尝试解码无效字符

游乐场:

编辑:嗯,你可以使用正则表达式,但不确定这对你来说有多可行:


非常好+1.毫无疑问,我也会使用这个。很棒的解决方案。如果确实修复了这种情况,它仍然无法修复数据编码错误的情况。我很想把每一个``都替换为零,但这是相当危险的……我现在真的什么都做不了,必须在解析之前对json文本进行预处理。是的,它成功了,谢谢!但在解码JSON之前,我把它转换成了字符串
type Model struct {
    Name  string `json:"name" bson:"name"`
    Email string `json:"email" bson:"email"` 
}
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())
}
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())
}