Отрисовка таблицы в шаблоне html, где данные таблицы — это ключи и значения некоторых данных json в Golang.
В бэкэнде я отправляю HTTP-запрос на какой-то сторонний сайт и получаю в ответ некоторые данные JSON. Ключи в ответе JSON не всегда одинаковы, но я имею некоторое представление о том, какими они могут быть. Например:
Отправка запроса наexample.com/data/1
может принести следующее:
{
"File.Trimmed": 54,
"Feature": "Generic"
}
При запросеexample.com/data/2
может принести следующее:
{
"File.Trimmed": 83,
"Object.Notation": "Reverse"
}
Моя цель — отобразить html-таблицы во внешнем интерфейсе, используя пары ключ-значение в том же порядке, в котором они были в ответе.
Итак, первая таблица будет такой:
Я создал следующую структуру для работы с этими данными:
type FileDetails struct {
FileTrimmed int `json:"File.Trimmed,omitempty"`
Feature string `json:"Feature,omitempty"`
ObjectNotation string `json:"Object.Notation,omitempty"`
}
// cannot use map[string]interface{} because that would destroy the order
var data FileDetails
err = json.NewDecoder(res.Body).Decode(&data)
На данный момент я пытаюсь решить, как отправитьdata
в шаблон и визуализировать таблицы. Можно получить теги json(содержимое столбца A) из экземпляра структуры, используяreflect
, но можно ли получить такие имена полей в циклах {{range}} в шаблоне? Если возможно, то как?
Или есть лучший способ достичь моей главной цели?
1 ответ
Ключи в ответе JSON не всегда одинаковы
Если ключи не всегда одинаковые, лучше использоватьmap
вместоstruct
. Но, как ты сказалthat would destroy the order
.
Один из подходов, который мы могли бы попробовать, когдаyou have some idea of what they might be
- мы должны проанализировать ответ в
map[string]interface{}
- а затем мы создадим фрагмент строки, который будет иметь указанные имена ключей. (Вы уже знаете, какие будут клавиши ответа)
И вот образец
var result map[string]interface{}
err = json.NewDecoder(resp.Body).Decode(&result)
if err != nil {
panic(err)
}
tableTemplate := `
<table>
<tr>
<th>Column A</th>
<th>Column B</th>
</tr>
{{range .Keys}}
<tr>
<td>{{.}}</td>
<td>{{index $.Data .}}</td>
</tr>
{{end}}
</table>
`
tmpl := template.New("table")
tmpl, err = tmpl.Parse(tableTemplate)
if err != nil {
fmt.Println("Error parsing template:", err)
return
}
templateData := map[string]interface{}{
"Data": result,
"Keys": []string{
"File.Trimmed", "Feature", "Object.Notation",
},
}
err = tmpl.Execute(w, templateData)
if err != nil {
fmt.Println("Error executing template:", err)
return
}
Это позволит сохранить содержимое напечатанным в упорядоченном виде.