Использование 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
как есть - тогда я получаю следующую ошибку:
паника: недопустимый символ '' в escape-коде строки
Это потому, что \\
становится \
, а \ + space
неверно экранирует в JSON. Я могу это исправить, добавив функцию js
в шаблон:
const tpl = `
{
"key": "{{- js .Value -}}"
}
`
В этом случае происходит сбой с другой ошибкой:
паника: недопустимый символ 'x' в escape-коде строки
Это потому, что функция js
преобразует знак >
в \x3c
, а \x
неверно экранирует в JSON.
Есть идеи, как получить универсальную функцию, которая правильно экранирует строки для JSON? Есть ли альтернативный способ (например, внешняя библиотека) для создания шаблонов JSON с учетом всех этих трудностей?