如何在Golang

时间:2017-02-01 09:01:55

标签: parsing templates go interface

我正在将表的所有行作为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对象。有办法解决这个问题吗?

2 个答案:

答案 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

Playground

顺便说一句,我相信那里隐藏着误解:

  

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)
}