gpt4 book ai didi

json - Golang 解码/解码 JSON 中的无效 unicode

转载 作者:IT王子 更新时间:2023-10-29 01:27:41 28 4
gpt4 key购买 nike

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

{"email": "\"blah.blah@blah.com\""}
{"email": "robert@gmail.com"}
{"name": "m\303\203ead"}

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

与:

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

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

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

最后,我通过这篇文章:(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
}
}

模型是:

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

我已经尝试了它的几种变体,但一直无法让它工作。

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

如果您正在阅读本文,还是谢谢您。

最佳答案

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

Playground :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())
}

关于json - Golang 解码/解码 JSON 中的无效 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24293790/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com