2017-02-01 22 views
0

テーブルのすべての行をjsonとして変数pdataにリトラクトし、インターフェイスオブジェクトに非整列化しています。 私は非構造化jsonデータと共にレンダリング関数に渡し、htmlテンプレートのフィールド引数{{.fieldname}}を使ってアクセスするユーザー構造体のインスタンスを持っています。複数のデータオブジェクトをGolangのHTMLテンプレートに渡す方法

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))私だけinterface{}オブジェクトにデータを非整列化に成功している。この出力に

[{"image":"1Appleiphone7.jpeg","pname":"iphone7","price":"70000","puid":"d6742e4e-2ad6-43c5-97f4-e8a7b00684e2","quantity":"100"}]

を与えます。タイプinterface{}のキーと種類stringの値を使用してマップを作成しようとしているが、それはエラーがスローされます。

"json: cannot unmarshal array into Go value of type map[interface {}]string"

レンダリング機能は、型の引数を取るinterface{}

func render(w http.ResponseWriter, name string, data interface{}) 

fmt.Println(Pr)すると、この出力が得られます。

[map[quantity:100 image:1Appleiphone7.jpeg pname:iphone7 price:70000 puid:d6742e4e-2ad6-43c5-97f4-e8a7b00684e2]]

u構造体のインスタンスであるUser

var u = &User{} 

type User struct { 
    Uuid  string    
    Username string   
    Password string   
    Fname string    
    Email string    
} 

出力は、パイプライン{{.}}を使用してhtmlページに表示されます。しかし、フィールド名を使用してデータにアクセスすることはできません。

これを行う方法が必要です。しかし、私はどのようにわからないのですか?

以下のタイプのjsonを渡すと、それを構造型に渡して、テンプレート内のパイプラインを使用してキー値で参照できます。

str := `{ 
    "image": "1Appleiphone7.jpeg", 
    "pname": "iphone7", 
    "price": "70000", 
    "puid": "d6742e4e-2ad6-43c5-97f4-e8a7b00684e2", 
    "quantity": "100" 
    }` 

アンマーシャル機能

err = json.Unmarshal([]byte(str), &Pr) 

DBレコードpdatastr上記一方のJSONデータの差は、「`」バッククォートの使用です。 jsonデータはキー値のペアを示していますが、実際はjson配列であり、jsonオブジェクトではありません。これを回避する方法はありますか?

+0

てみマップ[文字列]インターフェース{} – Sridhar

+0

あなたの質問は(私はそれを理解できるように)テンプレートではないマーシャリング解除についてです。話題を「GoLangでマルチ項目を非整列化する」のように変更してください。 – I159

答えて

0

jsonをunmarshallingという実例をバイトとしてstruct型に投稿しています。この型は、テンプレートの{{.}}を使って参照できます。

パッケージメイン

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

json objを非整列化するためにmap[interface{}]stringは必要ありません。あなたのJSONは、マップのスライスに相当します。

[ 
    { 
     "image":"1Appleiphone7.jpeg", 
     "pname":"iphone7", 
     "price":"70000", 
     "puid":"d6742e4e-2ad6-43c5-97f4-e8a7b00684e2", 
     "quantity":"100" 
    } 
] 

オブジェクト整列化に文字列のキーと値を持つマップのスライスでなければなりません:

var Pr []map[string]string 

Playground

ところで、私は誤解があると信じてそこに非表示:

The render function takes an argument of the type interface{}

私はあなたがpお尻の変数interface{}のタイプが、それはあなたがどのタイプの変数にの変数をrenderの機能を渡すことができることを意味します。

+0

多分、私は、製品Structのフィールドを保持する構造体を作成し、構造体を作成して、タイプUserとProductを保持するデータを別の構造体と言うことがあります。私はjsonを製品構造体にアンマーシャリングし、データをレンダリング関数に渡す必要があります。私は試してみましたが、それを正しく得ることができません – user3809560

+0

jason objを必要に応じてアンマーシャリングできますが、タイププロダクトとは何も分かりません。私があなたが投稿したjson objが[] [string]文字列に簡単にマップされることができるとみなすことができます。 – I159

関連する問題