在html模板中渲染表,其中table-data是Golang中一些json数据的键和值

wfveoks0  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(120)

在后端,我向一些第三方网站发送http请求,并检索一些json数据作为响应。json响应中的键并不总是相同的,但我对它们可能是什么有一些想法。举例来说:
example.com/data/1发送请求可能会导致以下结果:

{
  "File.Trimmed": 54,
  "Feature": "Generic"
}

字符串
而请求example.com/data/2可能会带来以下问题:

{
  "File.Trimmed": 83,
  "Object.Notation": "Reverse"
}


我的目标是在前端使用与响应中完全相同的键-值对呈现html表。
所以第一个表是:
| B栏| Column B |
| --| ------------ |
| 五十四| 54 |
| 通用| Generic |
第二张table:
| B栏| Column B |
| --| ------------ |
| 八十三| 83 |
| 反转| Reverse |
我创建了以下struct来处理这些数据:

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发送到模板并呈现表。可以使用reflect从struct示例中获取json标记(列A的内容),但是是否可以在模板中的{{range}}循环中获取字段名称?如果可能的话,怎么做?
有没有更好的方法来实现我的主要目标?

de90aj5v

de90aj5v1#

JSON响应中的键并不总是相同的
如果键不总是相同的,最好使用map而不是struct。就像你说的that would destroy the order
you have some idea of what they might be时我们可以尝试的一种方法

  • 我们应该将响应解析为map[string]interface{}
  • 然后我们将创建一个字符串slice,它将有按顺序排列的键名。(您已经知道响应键是什么)

这是样品

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
}

字符串
这将使内容按顺序打印。

相关问题