有没有办法在 golang 中格式化这个 json?



我今天才开始学习GoLang,我正在尝试构建一个简单的Rest API Web服务器。

这是我想要为每个请求发送到 Web 服务器的响应结构:

package main
type HttpResp struct{
Status      int         `json:"status"`
Description string      `json:"description"`
Body        string      `json:"body"`
}

这是我的文章.go文件,它具有获取数据库中所有文章的功能:

package main
import (
"encoding/json"
"net/http"
"log"
)
type Article struct{
Id          string  `json:"id"`
Title       string  `json:"title"`
Body        string  `json:"body"`
Description string  `json:"description"`
}
func AllArticles(w http.ResponseWriter, r *http.Request){
log.Print("/articles - GET")
db := connect()
defer db.Close()
var articles []Article
results, err := db.Query("SELECT * FROM Articles")
if err != nil{
log.Print(err)
return
}
for results.Next(){
var article Article
err = results.Scan(&article.Title, &article.Description, &article.Body, &article.Id)
if err != nil{
serr, _ := json.Marshal(err)
json.NewEncoder(w).Encode(HttpResp{Status: 500, Description: "Failed to retrieve all articles", Body: string(serr)})
}
articles = append(articles, article)
}   
sarr, _ := json.Marshal(articles)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(HttpResp{Status: 200, Body: string(sarr)})
}

我在这里面临的问题是响应是这样的:

{"status":200,"description":","body":"[{\"id\":\"1",\"title\":\"First",\">

body\":\"This 是一个测试体\",\"描述\":\"这是一个测试\"}]"}

我希望正文只是 JSON 而不是字符串。我怎样才能做到这一点?

身体HttpResp分开编组没有意义。相反,将Body字段的类型更改为interface{},然后将该字段设置为具体类型的任何值,而不是 json 字符串,例如[]Article,然后编组一次。

type HttpResp struct{
Status      int         `json:"status"`
Description string      `json:"description"`
Body        interface{} `json:"body"`
}

其余的...

package main
import (
"encoding/json"
"net/http"
"log"
)
type Article struct{
Id          string  `json:"id"`
Title       string  `json:"title"`
Body        string  `json:"body"`
Description string  `json:"description"`
}
func AllArticles(w http.ResponseWriter, r *http.Request){
log.Print("/articles - GET")
db := connect()
defer db.Close()
var articles []Article
results, err := db.Query("SELECT * FROM Articles")
if err != nil{
log.Print(err)
return
}
for results.Next(){
var article Article
err = results.Scan(&article.Title, &article.Description, &article.Body, &article.Id)
if err != nil{
serr, _ := json.Marshal(err)
json.NewEncoder(w).Encode(HttpResp{Status: 500, Description: "Failed to retrieve all articles", Body: string(serr)})
}
articles = append(articles, article)
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(HttpResp{Status: 200, Body: articles})
}

最新更新