Экранирование значений в шаблонах JSON - PullRequest
0 голосов
/ 18 января 2019

Использование 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 с учетом всех этих трудностей?

1 Ответ

0 голосов
/ 18 января 2019

Опция 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.

...