我正在将表的所有行作为json返回到变量pdata
并将其解组为接口对象。
我有一个用户结构的实例,我想将unmarshalled json数据传递给render函数,并使用html模板中的字段参数{{.fieldname}}
访问它。
if uuid != "" {
pdata, err := getProduct()
if err != nil {
fmt.Println(err)
}
type Prdata struct {
Puid string `json:"puid"`
Pname string `json:"pname"`
Quantity string `json:"quantity"`
Price string `json:"price"`
Image string `json:"image"`
}
// Obj:= make(map[Prdata]string)
var Pr Prdata
err = json.Unmarshal(pdata , &Pr)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(pdata))
fmt.Println(Pr)
fmt.Println(u)
render(w, "internal", Pr)
}
fmt.Println(string(pdata))
提供此输出
[{"图像":" 1Appleiphone7.jpeg"" PNAME":" iphone7""价格&#34 ;:" 70000"" PUID":" d6742e4e-2ad6-43c5-97f4-e8a7b00684e2""量":" 100"}]
我只是成功地将数据解组为interface{}
对象。尝试使用类型为interface{}
的键和类型为string
的值创建地图但会引发错误:
" json:无法将数组解组为类型为map [interface {}]字符串的Go值"
render函数采用类型interface{}
func render(w http.ResponseWriter, name string, data interface{})
fmt.Println(Pr)
给出了这个输出:
[地图[数量:100图片:1Appleiphone7.jpeg pname:iphone7价格:70000 puid:d6742e4e-2ad6-43c5-97f4-e8a7b00684e2]]
u
是struct User
var u = &User{}
type User struct {
Uuid string
Username string
Password string
Fname string
Email string
}
我可以使用管道{{.}}
在html页面上看到输出。但是,我无法使用fieldname访问任何数据。
必须有办法做到这一点。但我不知道怎么样?
当我传递下面类型的json时,我能够将它传递给struct类型,并使用模板中的管道通过键值引用它。
str := `{
"image": "1Appleiphone7.jpeg",
"pname": "iphone7",
"price": "70000",
"puid": "d6742e4e-2ad6-43c5-97f4-e8a7b00684e2",
"quantity": "100"
}`
解组函数
err = json.Unmarshal([]byte(str), &Pr)
DB记录pdata
和上面str
的json数据的差异在于使用反引号"`"。似乎虽然json数据显示了键值对,但它实际上是一个json数组而不是json对象。有办法解决这个问题吗?
答案 0 :(得分:0)
您不需要map[interface{}]string
来解组json obj。你的json相当于一片地图:
[
{
"image":"1Appleiphone7.jpeg",
"pname":"iphone7",
"price":"70000",
"puid":"d6742e4e-2ad6-43c5-97f4-e8a7b00684e2",
"quantity":"100"
}
]
要解组的对象应该是带有字符串键和值的映射片段:
var Pr []map[string]string
顺便说一句,我相信那里隐藏着误解:
render函数接受interface {}
类型的参数
我的意思并不是你必须传递interface{}
类型的变量,但这意味着你可以将任何类型的变量传递给render
函数。
答案 1 :(得分:0)
我发布了一个将解组json作为字节组合成结构类型的工作示例,然后可以使用模板中的{{.}}
来引用它。
package main
import (
"encoding/json"
"fmt"
)
type Usrdata struct {
Uuid string
Fname string
}
type Prdata struct {
Puid string `json:"puid"`
Pname string `json:"pname"`
Quantity string `json:"quantity"`
Price string `json:"price"`
Image string `json:"image"`
}
type Data struct {
U Usrdata
P []Prdata
}
func main() {
Ur := Usrdata{Uuid: "xyz", Fname: "Somename"}
Pr := make([]Prdata, 0)
var Dt Data
Dt.U = Ur
pdata := `[{"image":"1Appleiphone7.jpeg","pname":"iphone7","price":"70000","puid":"d6742e4e-2ad6-43c5-97f4-e8a7b00684e2","quantity":"100"}]`
err := json.Unmarshal([]byte(pdata), &Pr)
if err != nil {
fmt.Println(err)
}
Dt.P = Pr
fmt.Println(Pr[0].Pname)
fmt.Println(Pr)
fmt.Println(Dt)
}