如何使用 golang 将未编组的 JSON 连接到 HTML 页面?

Posted

技术标签:

【中文标题】如何使用 golang 将未编组的 JSON 连接到 HTML 页面?【英文标题】:How to connect JSON that is unmarshaled to an HTML page using golang? 【发布时间】:2020-11-14 06:00:38 【问题描述】:

我已经解组了我的 JSON,我可以直接从 registry.go 文件打印数据。我不明白(而且我是 golang 和后端开发的新手)是如何将该数据连接到我的 html 页面。如果有人能向我解释如何做到这一点,我将不胜感激。

我看过一些示例,但它们都在一个文件中,我想将 JSON、HTML 和 Go 页面分开。 JSON 是直接从 API 中提取的,并且会有多个 HTML 页面使用该数据。

这是一个示例,非常接近我使用的 JSON,它是从 API 中提取的:


    "count": 4,
    "next": null,
    "previous": null,
    "results": [
        
            "id": 1,
            "description": "some text",
            "displayName": "some more text",
            "status": 
                "status": "UP",
                "lastUpdate": "2020-07-21T12:42:24.968647Z"
            ,
            "type": "test"
        ,
        
            "id": 2,
            "description": "some text",
            "displayName": "some more text",
            "status": 
                "status": "UP",
                "lastUpdate": "2020-07-21T12:42:24.968647Z"
            ,
            "type": "test"
        ,
        
            "id": 3,
            "description": "some text",
            "displayName": "some more text",
            "status": 
                "status": "UP",
                "lastUpdate": "2020-07-21T12:42:24.968647Z"
            ,
            "type": "test"
        ,
        
            "id": 4,
            "description": "some text",
            "displayName": "some more text",
            "status": 
                "status": "UP",
                "lastUpdate": "2020-07-21T12:42:24.968647Z"
            ,
            "type": "test"
        
    ]

这是我正在使用的 registry.go 页面。我有一个单独的 main.go 页面,因为我已经创建了其他页面。我试图将这部分分开,但如果我不能请告诉我。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"
)

// Results struct which contains
// an array of results
type Results struct 
    Count   int      `json:"count"`
    Results []Result `json:"results"`


// Results struct which contains the ID and description
type Result struct 
    ID          int    `json:"id"`
    Description string `json:"description"`
    DisplayName string `json:"displayName"`
    Status      Status `json:"status"`
    Type        string `json:"type"`


// Status struct
type Result struct 
    Status      string `json:"status"`
    LastUpdated string `json:"lastUpdated"`


func main() 
    // Open the jsonFile
    jsonFile, err := os.Open("test.json")
    // if os.Open returns an error then handle it
    if err != nil 
        fmt.Println(err)
    

    fmt.Println("Successfully Opened test.json")
    // defer the closing of the jsonFile in order to parse it later on
    defer jsonFile.Close()

    // read the opened xmlFile as a byte array.
    byteValue, _ := ioutil.ReadAll(jsonFile)

    // initialize the results array
    var results Results

    // unmarshal the byteArray
    json.Unmarshal(byteValue, &results)

    // Print the count
    fmt.Println(results.count)
    // iterate through the results and print
    for i := 0; i < len(users.Users); i++ 
        fmt.Println("ID: " + results.Results[i].ID)
        fmt.Println("Desctiption: " + results.Results[i].Description)
    

这是我创建的 html 页面(test.html),仅显示正文部分:

<body>
    range .
        <div>
            <h3>.DisplayName</h3>
        </div>
        <div>.Id</div>
        <div>.Description</div>
        <div>.Type</div>
    end
</body>

在 Main.go 我有以下参考:

//handler to display the page
http.HandleFunc("/test", hndlerTest)

//hndlerTest - the Testing Page
func hndlerTest(w http.ResponseWriter, req *http.Request)
    renderTemplate(w,"test.html", nil)

【问题讨论】:

【参考方案1】:

您可以使用html template package 来解析和呈现html 文件并将执行的模板写入您的http 响应。可以参考下面的例子入手。

package main

import (
    "encoding/json"
    "html/template"
    "log"
    "net/http"
)

var htmlFile = `
<body>
    range .Foos
        <span>Foo: .Foo</span>
    end
</body>
`

var jsonData = `["foo":1,"foo":2,"foo":3]`

type foo struct 
    Foo int `json:"foo"`


type Data struct 
    Foos []foo


func main() 
    var d Data
    if err := json.Unmarshal([]byte(jsonData), &d.Foos); err != nil 
        panic(err)
    

    http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) 
        // Use template.New("index").ParseFiles("index.html") for files
        templ, err := template.New("index").Parse(htmlFile)
        if err != nil 
            panic(err)
        

        if err := templ.Execute(rw, d); err != nil 
            panic(err)
        
    )
    log.Panic(http.ListenAndServe(":3030", nil))

【讨论】:

以上是关于如何使用 golang 将未编组的 JSON 连接到 HTML 页面?的主要内容,如果未能解决你的问题,请参考以下文章

golang 将json映射到GO中的struct,用于直接编组,unmarshal

是否有一个包可以在 golang 中编组进出 x-www-form-urlencoding

如何在 GoLang 中分离编组的 ecdsa 公钥和私钥

Flask-restful:将复杂对象编组为 json

在 Golang 中解组 XML 时如何在 interface 中获取数据?

如何使用 Jersey 将嵌套列表编组为 JSON?我得到一个空数组或一个包含数组的单元素字典数组