英文:
How to unmarshal escaped string
问题
我有一个关于在Go中解析JSON字符串的愚蠢问题。
以下是代码:
package main
import (
"bytes"
"encoding/json"
"fmt"
)
func main() {
s := "{\"just_a_key\":\"Some text \\\"some quoted text\\\"\"}"
fmt.Println(s)
buf := bytes.NewBufferString(s)
data := make(map[string]string)
err := json.Unmarshal(buf.Bytes(), &data)
if err != nil {
fmt.Println(err)
}
fmt.Println(data)
}
输出结果:
{"just_a_key":"Some text \"some quoted text\""}
invalid character 's' after object key:value pair
看起来解析器真的不喜欢 \\\"
这个序列。我该如何解决这个问题?
英文:
I have a dumb question regarding JSON string unmarshalling in Go
Here's the code:
package main
import (
"bytes"
"encoding/json"
"fmt"
)
func main() {
s := "{\"just_a_key\":\"Some text \"some quoted text\"\"}"
fmt.Println(s)
buf := bytes.NewBufferString(s)
data := make(map[string]string)
err := json.Unmarshal(buf.Bytes(), &data)
if err != nil {
fmt.Println(err)
}
fmt.Println(data)
}
The output:
{"just_a_key":"Some text "some quoted text""}
invalid character 's' after object key:value pair
Seems like unmarshaller really hates '\"' sequence. How can I fix the issue?
答案1
得分: 3
您的输入不是有效的JSON。在JSON字符串中使用双引号时,您需要对其进行转义。使用\"
序列表示双引号字符。
但是,由于您正在使用一个解释的Go字符串字面量来指定JSON文本,\"
序列也必须根据Go解释规则进行转义,其中反斜杠是\\
,双引号是\"
,因此JSON的\"
序列在Go解释的字符串字面量中必须出现为\\\"
:
s := "{\"just_a_key\":\"Some text \\\"some quoted text\\\"\"}"
通过这个更改,输出结果是(在Go Playground上尝试一下):
{"just_a_key":"Some text \"some quoted text\""}
map[just_a_key:Some text "some quoted text"]
如果您使用原始字符串字面量(不需要Go转义,只需要JSON转义),那么这将更加简单和清晰:
s := `{"just_a_key":"Some text \"some quoted text\""}`
这将输出相同的结果。在Go Playground上尝试一下这个方法。
英文:
Your input is not valid JSON. To have a double quote inside a JSON string, you have to escape it. Use the \"
sequence for a double quote character.
But since you're using an interpreted Go string literal to specify the JSON text, the \"
sequence also have to be escaped according to the Go interpreted rules, where a backslash is \\
and the double quote is \"
, so the JSON \"
sequence must appear as \\\"
in a Go interpreted string literal:
s := "{\"just_a_key\":\"Some text \\\"some quoted text\\\"\"}"
With this change output is (try it on the Go Playground):
{"just_a_key":"Some text \"some quoted text\""}
map[just_a_key:Some text "some quoted text"]
It's much easier and cleaner if you use raw string literal (where no Go escaping is needed, just the JSON escaping):
s := `{"just_a_key":"Some text \"some quoted text\""}`
This will output the same. Try this one on the Go Playground.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论