Возможно изменять выборы JSON в html/template?

html/template у него есть очень подходящая функция. Если у меня есть один, сдержись так:


...

...

Переменная Data смоги быть любого типа, и html/template он это обращает в JSON. Например:


...

...

Мой вопрос: Возможно использовать различные выборы для формата JSON? Мне хотелось бы, например, использовать json.MarshalIndent() чтобы заставлять вывод самого легкого template читать.

3
задан 13.09.2016, 02:28
2 ответа

Могут использоваться Персонализированные Функции Шаблона (custom сдержись functions) для того, чтобы давать ему желанный формат.

  1. Мы определяем функцию marshalindent, что возвращает один template.JSStr (с действительными утечками внутри string ):

    funcMap := template.FuncMap {
        "marshalindent": func(obj interface {}) template.JSStr {
            mi, _ := json.MarshalIndent(obj, "", "    ")
            return template.JSStr(mi)
        },
    }
    
  2. Используя функцию в сдержись:

    const templ = `<html><body>
    <script>
        var x = '{{ .Data | marshalindent }}';
        console.log(x);
    </script>
    </body></html>`
    
  3. И, в конце концов, мы перемещаем renderizador шаблона функцию (в водопаде):

    t := template.Must(template.New("").Funcs(funcMap).Parse(templ))
    


Полный код

import (
    "html/template"
    "encoding/json"
    "os"
)

type Contenido struct {
    Id    int         `json:"Id"`
    Data  Personales  `json:"Data"`
}

type Personales struct {
    Nombre  string  `json:"nombre"`
    Edad    int     `json:"edad"`
}


const templ = `<html><body>
<script>
    var x = '{{ .Data | marshalindent }}';
    console.log(x);
</script>
</body></html>`

func main() {

    funcMap := template.FuncMap {
        "marshalindent": func(obj interface {}) template.JSStr {
            mi, _ := json.MarshalIndent(obj, "", "    ")
            return template.JSStr(mi)
        },
    }

    contenido := Contenido{1, Personales{"José", 32}}

    t := template.Must(template.New("").Funcs(funcMap).Parse(templ))
    if err := t.Execute(os.Stdout, contenido); err != nil {
        panic(err)
    }
}

Demo в Го Плаигроунд


Результат

<html><body>
<script>
    var x = '{\n    \x22nombre\x22: \x22José\x22,\n    \x22edad\x22: 32\n}';
    console.log(x);
</script>
</body></html>

Demo в Го Плаигроунд

2
ответ дан 24.11.2019, 13:25

Я не знаю язык go , никогда это habГ - в видный, но могу давать ответ, который я смог разрабатывать исследуя в Интернете.

Давайте Предполагать этот пример, у нас есть следующая структура.

type keyvalue struct {Nombre, Edad string}

Со следующей стоимостью.

x := []keyvalue{{"José", "32"}}

В следующей lГ-nea могут видеть cГіmo использование MarshalIndent, помещают себе \t, чтобы табулировать.

json, _ := json.MarshalIndent(x, "", "\t")

Результата остается , незазубренные из следующего способа.

[
    {
        "Nombre": "José",
        "Edad": "32"
    }
]

CГіdigo конец.

https://play.golang.org/p/mxWgoopAoJ

package main

import (
    "encoding/json"
    "html/template"
    "log"
    "os"
)

func main() {

    type keyvalue struct {
        Nombre, Edad string
    }
    x := []keyvalue{{"José", "32"}}
    tr, err := template.New("tr").Parse("{{.}}")
    if err != nil {
        log.Fatal(err)
    }
    json, _ := json.MarshalIndent(x, "", "\t")
    err = tr.ExecuteTemplate(os.Stdout, "tr", template.HTML(json))
}
1
ответ дан 24.11.2019, 13:25