Отрисовка таблицы в шаблоне 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
}

Это позволит сохранить содержимое напечатанным в упорядоченном виде.

Другие вопросы по тегам