登录
首页 >  Golang >  Go问答

在Go中,用于未解析的失败的strconv.Unquote不会删除转义的JSON字符

来源:stackoverflow

时间:2024-02-06 21:18:23 301浏览 收藏

你在学习Golang相关的知识吗?本文《在Go中,用于未解析的失败的strconv.Unquote不会删除转义的JSON字符》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

我正在解析相当简单的 json,其中日期格式字符串中的斜杠在响应到达时被转义。

但是,当您尝试解组字符串时,它会因“无效语法”错误而失败。 所以我用谷歌搜索,我们应该使用 strconv.unquote 首先替换转义字符。这样做了,现在 unquote 函数因“未知转义”错误而失败。然而 json rfc 8259 显示这是一个有效的情况。那么为什么有效的 json 会导致 go 解组器失败呢?

这是简单的 json

{
   "created_at": "6\/30\/2022 21:51:49"
}
var dst string
    err := json.unmarshal([]byte("6\/30\/2022 21:51:49"), dst) // this fails on ivnalid quote
    fmt.println(dst, err)

    s, err := strconv.unquote(`"6\/30\/2022 21:51:49"`) // this fails on ivnalid syntax
    fmt.println(s, err)

当 json 有效,但 go 的任何内置函数都没有实际解析它时,如何处理这种情况?除了手动在 json []byte 中编写简单的查找和替换模式之外,正确的方法是什么?

编辑: 好吧,我想我应该问一个更好的问题或提供场景中的具体示例,而不仅仅是其中的一部分。垃圾进垃圾出,都是我的错。 事情是这样的。假设我们有特定的非标准时间格式,如上面的 json 示例所示。

{
   "created_at": "6\/30\/2022 21:51:49"
}

我需要将其解析为 go time 类型的结构。因为时间的标准解析器对于该格式会失败,所以我创建了一个自定义类型。

type Request struct {
    CreatedAt Time `json:"created_at"`
}

type Time time.Time

unc (d *Time) UnmarshalJSON(b []byte) error {
    s := strings.Trim(string(b), "\"")
    parse, err := time.Parse("1/2/2006 15:04:05", s) // this fails because of the escaped backslashes
    if err != nil {
        return err
    }
    *d = Time(parse)
    return nil
}

以下是演示中的示例:https://go.dev/play/p/be3awqev-ug

panic:将时间“6\\/30\\/2022 21:51:49”解析为“1/2/2006 15:04:05”:无法解析“\\/30\\/2022 21: 51:49" 为 "/"

这就是我尝试将 unquote 放入自定义解组函数中的原因,但这不是正确的方法,正如已经指出的那样。例如,默认字符串 json 解组器如何删除那些转义的斜杠?哦,我无法控制写入 json 的一侧,它带有单个转义斜杠,就像 []byte 中的 *http.response


正确答案


go 有一个很棒的内置函数,可以将 json 字符串转换为 go 字符串:json.unmarshal。以下是如何将其与自定义 unmarshaljson 方法集成:

func (d *time) unmarshaljson(b []byte) error {
    var s string
    if err := json.unmarshal(b, &s); err != nil {
        return err
    }
    // remove this line: s := strings.trim(string(b), "\"")
    // the rest of the code is unchanged

unquote 是为当您有像 "\"my name\"" 这样的双引号字符串的情况而设计的,在这种情况下您实际上并不需要它。

该代码的问题在于您正在尝试解组非 json 的字节切片。您还将解组为一个不起作用的字符串。您需要解组为具有 json 标签的结构或解组为映射。

var dest map[string]string

somejsonstring := `{
"created_at": "6\/30\/2022 21:51:49"
}`


err := json.unmarshal([]byte(somejsonstring), &dest)

if err != nil {     
    panic(err)
}

fmt.println(dest)

如果你想将 unmarshal 转换为结构,你可以这样做

type SomeStruct struct {
    CreatedAt string `json:"created_at"`
}

someJsonString := `{
   "created_at": "6\/30\/2022 21:51:49"
}`

var data SomeStruct

err := json.Unmarshal([]byte(someJsonString), &data)

if err != nil {
    panic(err)
}

fmt.Println(data)

本篇关于《在Go中,用于未解析的失败的strconv.Unquote不会删除转义的JSON字符》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>