Golang中JSON数据无法显示的问题如何解决

Golang中JSON数据无法显示的问题如何解决 你好, 当我从以下函数中获取数据时,我可以使用 fmt.Println 将其打印出来,但在浏览器和 Postman 中,我得到的是以下内容: [ {}, {}, {} ] 函数如下。

func sendResponse(w http.ResponseWriter, statusCode int, payload interface{}){

fmt.Println("Payload Unmarshal ",payload)
// 打印这个 >> Payload Unmarshal  [{1 Java} {2 python} {3 golang}]

response, _ := json.Marshal(payload)

w.Header().Set("Content-Type","application/json; charset=utf-8")

w.WriteHeader(statusCode)

fmt.Println("From sendResponse app ",response)
// 打印这个 >> From sendResponse app  [91 123 125 44 123 125 44 123 125 93]

w.Write(response)

}

有人能在这方面帮助我吗?代码中哪里出错了?


更多关于Golang中JSON数据无法显示的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

不,情况并非如此(无效的JSON)!

更多关于Golang中JSON数据无法显示的问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


万分感谢,现在可以正常工作了! 我之前没有注意到这一点 :frowning:

再次感谢 :slight_smile:

aab:

[{1 Java} {2 python} {3 golang}]

无效的JSON!??

错误:第1行解析错误:[{1 Java} {2 python} { --^ 期望是 ‘STRING’ 或 ‘}’,但得到了 ‘NUMBER’

不需要运行它。已经找到了问题:

type language struct {
	id int `json:"id"`
	name string `json:"name"`
}

这些字段没有导出。将其改为:

type language struct {
	ID int `json:"id"`
	Name string `json:"name"`
}

感谢您的回复和考虑。我正在处理的代码位于此处。 为了运行应用程序,您需要做的就是运行 docker-compose up 并访问 localhost:8080/languages 来获取所有语言信息。

感谢您的回复,但这并没有帮助 😵

fmt.Println("From sendResponse app ",response)
// Payload Unmarshal  [{1 Java} {2 python} {3 golang}]
fmt.Println("From sendResponse app ", string(response))
//  From sendResponse app  [{},{},{}]

首先我注意到:你可能忽略了一个错误。请将以下代码:

// 从这样...
response, _ := json.Marshal(payload)
// ...改为这样:
response, err := json.Marshal(payload)
if err != nil {
	fmt.Println("error:", err)
}

如果你想查看 json.Marshal 处理后的字符串实际内容,也可以修改这行代码:

// 从这样...
fmt.Println("From sendResponse app ",response)
// ...改为这样:
fmt.Println("From sendResponse app ", string(response))

尝试一下,然后告诉我们你发现了什么。

payload 的类型是什么?我怀疑你的问题来自于这里未显示的代码。考虑以下示例:

package main

import (
	"encoding/json"
	"fmt"
)

type Payload struct {
	ID    int
	Value string
}

func main() {
	payload := []Payload{{1, "Java"}, {2, "python"}, {3, "golang"}}
	fmt.Println(payload)
	response, err := json.Marshal(payload)
	if err != nil {
		fmt.Println("error:", err)
	}
	fmt.Println(string(response))
}

… 其输出为:

[{1 Java} {2 python} {3 golang}]
[{"ID":1,"Value":"Java"},{"ID":2,"Value":"python"},{"ID":3,"Value":"golang"}]

你可以在 Go Playground 中亲自运行它。如果你能调整此代码以提供一个可复现的示例,这里或许有人能帮助你。

问题出在结构体的字段没有导出(首字母大写)。JSON 包只能访问导出的字段。

你的结构体字段可能是小写,例如:

type Item struct {
    id   int
    name string
}

应该改为:

type Item struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

完整示例:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type Item struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func main() {
    http.HandleFunc("/data", handler)
    http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
    data := []Item{
        {ID: 1, Name: "Java"},
        {ID: 2, Name: "Python"},
        {ID: 3, Name: "Golang"},
    }
    
    sendResponse(w, http.StatusOK, data)
}

func sendResponse(w http.ResponseWriter, statusCode int, payload interface{}) {
    response, _ := json.Marshal(payload)
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    w.WriteHeader(statusCode)
    w.Write(response)
}

现在浏览器和Postman会显示:

[
    {"id": 1, "name": "Java"},
    {"id": 2, "name": "Python"},
    {"id": 3, "name": "Golang"}
]
回到顶部