gpt4 book ai didi

json - 对于 encoding/json,如何优雅地处理键名中包含撇号的 API JSON 调用?

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

我正在编写一个简单的 Go 程序来使用一个简单的 API。某些值未正确解码到我的结构中,我已将问题追溯到返回的 JSON 对象中的无效键名称。

我可以用这段代码重现这个问题:

jsonStr := `{
"valid_json": "I'm Valid",
"invalid'json": "I should be valid, but I'm not"
}`

type result struct {
Valid string `json:"valid_json"`
Invalid string `json:"invalid'json"`
}

var res result
err := json.Unmarshal([]byte(jsonStr), &res)
if err != nil {
log.Fatal(err)
}

fmt.Printf("Valid: %s\n", res.Valid)
fmt.Printf("Invalid: %s\n", res.Invalid)

结果输出:

Valid:   I'm Valid
Invalid:

我的预期输出:

Valid:   I'm Valid
Invalid: I should be valid, but I'm not

我已经尝试过诸如转义结构标记中的 ' 之类的选项,但这要么导致错误,要么被忽略。我也研究过其他方法,但都空手而归。

我这边如何妥善处理这个问题?在解码之前剥离 ' 会更好吗?还是有其他方法可以接受单引号?

最佳答案

根据 json.Marshal 的文档...

The key name will be used if it's a non-empty string consisting of only Unicode letters, digits, and ASCII punctuation except quotation marks, backslash, and comma.

相关代码似乎是isValidTag .根据评论,“保留引号字符”以供将来在标记语法中使用。

func isValidTag(s string) bool {
if s == "" {
return false
}
for _, c := range s {
switch {
case strings.ContainsRune("!#$%&()*+-./:<=>?@[]^_{|}~ ", c):
// Backslash and quote chars are reserved, but
// otherwise any punctuation chars are allowed
// in a tag name.
case !unicode.IsLetter(c) && !unicode.IsDigit(c):
return false
}
}
return true
}

您可以通过使用接口(interface)而不是结构来解决这个问题。

package main
import (
"fmt"
"encoding/json"
"log"
)
func main() {
jsonStr := `{
"valid_json": "I'm Valid",
"invalid'json": "I should be valid, but I'm not"
}`

var res interface{}
err := json.Unmarshal([]byte(jsonStr), &res)
if err != nil {
log.Fatal(err)
}

m := res.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "is string", vv)
case float64:
fmt.Println(k, "is float64", vv)
case []interface{}:
fmt.Println(k, "is an array:")
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know how to handle")
}
}
}

参见 JSON and Go 中的“解码任意数据”了解更多。

关于json - 对于 encoding/json,如何优雅地处理键名中包含撇号的 API JSON 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53983721/

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