如何使用 Go 提供 JSON 响应?

问题:目前我正在func Index 像这样打印我的响应,fmt.Fprintf(w, string(response)) 但是如何在请求中正确发送 JSON 以便它可能被视图使用?


package main


import (

    "fmt"

    "github.com/julienschmidt/httprouter"

    "net/http"

    "log"

    "encoding/json"

)


type Payload struct {

    Stuff Data

}

type Data struct {

    Fruit Fruits

    Veggies Vegetables

}

type Fruits map[string]int

type Vegetables map[string]int



func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {

    response, err := getJsonResponse();

    if err != nil {

        panic(err)

    }

    fmt.Fprintf(w, string(response))

}



func main() {

    router := httprouter.New()

    router.GET("/", Index)

    log.Fatal(http.ListenAndServe(":8080", router))

}


func getJsonResponse()([]byte, error) {

    fruits := make(map[string]int)

    fruits["Apples"] = 25

    fruits["Oranges"] = 10


    vegetables := make(map[string]int)

    vegetables["Carrats"] = 10

    vegetables["Beets"] = 0


    d := Data{fruits, vegetables}

    p := Payload{d}


    return json.MarshalIndent(p, "", "  ")

}


波斯汪
浏览 195回答 3
3回答

米琪卡哇伊

您可以设置内容类型标头,以便客户知道期望 jsonw.Header().Set("Content-Type", "application/json")将结构编组为 json 的另一种方法是使用 http.ResponseWriter// get a payload p := Payload{d}json.NewEncoder(w).Encode(p)

泛舟湖上清波郎朗

其他用户在编码时评论说Content-Type是plain/text。您必须先使用 设置内容类型w.Header().Set(),然后使用w.WriteHeader().如果你w.WriteHeader()先打电话,然后再打电话w.Header().Set(),你会得到plain/text。示例处理程序可能如下所示:func SomeHandler(w http.ResponseWriter, r *http.Request) {    data := SomeStruct{}    w.Header().Set("Content-Type", "application/json")    w.WriteHeader(http.StatusCreated)    json.NewEncoder(w).Encode(data)}

梵蒂冈之花

你可以在你的getJsonResponse函数中做这样的事情-jData, err := json.Marshal(Data)if err != nil {    // handle error}w.Header().Set("Content-Type", "application/json")w.Write(jData)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go