登录
首页 >  Golang >  Go问答

在JSON模板中转义的数值

来源:stackoverflow

时间:2024-02-28 10:03:25 369浏览 收藏

本篇文章向大家介绍《在JSON模板中转义的数值》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

使用 html/template 创建 json 输出。代码片段如下(演示):

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "html/template"
)

const tpl = `
{
    "key": "{{- .value -}}" // replace with js .value to get another error
}
`

func main() {
    t, err := template.new("").parse(tpl)
    if err != nil {
        panic(err)
    }
    var buf bytes.buffer
    err = t.execute(&buf, struct{
        value string
    }{"test\\ > \\ value"})
    if err != nil {
        panic(err)
    }
    data := make(map[string]string)
    err = json.unmarshal(buf.bytes(), &data)
    if err != nil {
        panic(err)
    }
    fmt.printf("%v\n", data)
}

如果我尝试按原样插入 .value - 那么我会收到以下错误:

恐慌:字符串转义代码中的无效字符“”

这是因为 \\ 变为 \ 并且 \ + space 在 json 中转义不正确。我可以通过向模板添加 js 函数来解决此问题:

const tpl = `
{
    "key": "{{- js .Value -}}"
}
`

在这种情况下,它会失败并出现另一个错误:

恐慌:字符串转义代码中的无效字符“x”

这是因为 js 函数将 > 符号转换为 \x3c 并且 \x 在 json 中转义不正确。

有什么想法如何获得一个正确转义 json 字符串的通用函数吗?考虑到所有这些困难,是否有其他方法(例如外部库)来创建 json 模板?


解决方案


选项0

https://play.golang.org/p/4DMTAfEapbM

正如 @adrian 建议的那样,使用 text/template,所以我们只需要一个 unescape 和结尾。

选项 1

https://play.golang.org/p/oPC1E6s-EwB

在执行模板之前转义,然后在需要字符串值时取消转义两次。

选项 2

https://play.golang.org/p/zD-cTO07GZq

将“\\”替换为“\\\\”。

}{"Test\\ > \\ Value"})
to
}{"Test\\\\ > \\\\ Value"})

还有一个

json 中不支持“//”注释。

今天关于《在JSON模板中转义的数值》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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