在Golang中解析转义的JSON字符串

3

假设我有以下这个json字符串:

{\"A\":\"a\",\"B\":\"b\",\"C\":\"c\",\"D\":2,\"E\":\"e\"}

我想将上述字符串转换为结构体:
{
  A string
  B string
  C string
  D int
  E string
}

我不确定如何做到这一点,因为我已经尝试过引用和取消引用,但似乎还没有成功。


字符串的引述规则是什么?答案取决于所使用的引述方式。例如,如果该字符串是 JSON 编码的 JSON,则需进行两次解封(unmarshal)。如果该字符串使用 Go 引述,则使用 strconv.Unquote。 - Charlie Tumahai
3个回答

7

在取消引用之前,将您的输入字符串进行包装,如下所示:

s,err := strconv.Unquote(`"`+yourstring+`"`)

然后您可以继续进行反序列化。

2

这有点像一个技巧,但如果输入字符串在JSON对象中编码,你可以这样做:

x:=json.RawMessage(`"{\"A\":\"a\",\"B\":\"b\",\"C\":\"c\",\"D\":2,\"E\":\"e\"}"`)
var v string
err:=json.Unmarshal(x,&v)
var x MyStruct
json.Unmarshal([]byte(v),&x)

我遇到了一个错误:“无效字符'\',寻找对象键字符串的开头”。 - Jake Muller
我使用了一个包,其中的函数接受字符串作为参数。我读到这个参数接收了这个转义后的 JSON,将其转换为原始消息,进行解组,然后出现了这个错误。 - Jake Muller
原始消息是[]字节。删除反斜杠可能更容易一些。 - Burak Serdar
strconv.Unquote无法工作(遇到无效语法)时,你可以尝试这个方法。非常感谢。 - jk2K

1
你可以使用mfathirirhas建议的strconvUnquote方法,我创建了一个小代码,描述了你的场景如下:
package main

import (
    "encoding/json"
    "fmt"
    "strconv"
)

type response struct {
    A string
    B string
    C string
    D int
    E string
}

func main() {

    str := (`"{\"A\":\"a\",\"B\":\"b\",\"C\":\"c\",\"D\":2,\"E\":\"e\"}"`)
    fmt.Printf(str)
    s, err := strconv.Unquote(str)
    fmt.Println()
    fmt.Println(s, err)
    var resp response
    if err := json.Unmarshal([]byte(s), &resp); err != nil {
        panic(err)
    }
    fmt.Println(resp)

}

输出:

"{\"A\":\"a\",\"B\":\"b\",\"C\":\"c\",\"D\":2,\"E\":\"e\"}"
{"A":"a","B":"b","C":"c","D":2,"E":"e"} <nil>
{a b c 2 e}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接