2

以下は、作業コードのスニペットです。私はジンテンプレートエンジンを使用しています。

c.HTML(200, "index", gin.H{
            "title":    "Welcome",
            "students": map[int]map[string]string{1: {"PID": "1", "Name": "myName"}},})

そして、インデックステンプレートには次のものがあります:

 <TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range $student := .students}}
        <td>{{$student.Name}}</td>                    
        {{end}}
 </TABLE>

ご覧のとおりstudents、ヘッダー (マップ) の値をハードコーディングしました。私が構築した残りの API からこのデータを取得したいと考えています。私の残りのAPIの応答は配列です:

 [
  {
    "id": 1,
    "name": "Mary"
  },
  {
    "id": 2,
    "name": "John"
  }
]

map[string]stringの代わりに、この JSON 応答をアンマーシャリングできますmap[int]map[string]string。この非整列化されたボディを学生のパラメーター値に渡し、この配列をインデックス テンプレートで反復処理するにはどうすればよいでしょうか?

4

1 に答える 1

1

構造体で

あなたが持っているのは JSON 配列で、それを Go スライスに非整列化します。Studentクリーンで意識的な Go コードを持つように学生をモデル化するための構造体を作成することをお勧めします。

テンプレートでは、{{range}}アクションは.現在の要素にドットを設定します。{{range}}ボディ内で単にドットとして参照できる.ため、学生の名前は になります.Name

作業コード ( Go Playgroundで試してください):

func main() {
    t := template.Must(template.New("").Parse(templ))
    var students []Student
    if err := json.Unmarshal([]byte(jsondata), &students); err != nil {
        panic(err)
    }
    params := map[string]interface{}{"Students": students}
    if err := t.Execute(os.Stdout, params); err != nil {
        panic(nil)
    }
}

const jsondata = `[
  {
    "id": 1,
    "name": "Mary"
  },
  {
    "id": 2,
    "name": "John"
  }
]`

const templ = `<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range .Students}}
        <td>{{.Name}}</td>                    
        {{end}}
 </TABLE>`

出力:

<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>

        <td>Mary</td>                    

        <td>John</td>                    

 </TABLE>

地図付き

構造体を作成して使用したくない場合Studentでも、任意の JSON オブジェクトを表すことができるタイプの単純なマップを使用してそれを行うことができmap[string]interface{}ますが、この場合、学生の名前をそのまま参照する必要があることを知っておいてください.name。 JSON テキストでどのように表示されるかを示すため、マーシャリングされていない Go マップでは小文字"name"のキーが使用されます。

func main() {
    t := template.Must(template.New("").Parse(templ))
    var students []map[string]interface{}
    if err := json.Unmarshal([]byte(jsondata), &students); err != nil {
        panic(err)
    }
    params := map[string]interface{}{"Students": students}
    if err := t.Execute(os.Stdout, params); err != nil {
        panic(nil)
    }
}

const templ = `<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range .Students}}
        <td>{{.name}}</td>                    
        {{end}}
 </TABLE>`

出力は同じです。Go Playgroundでこのバリアントを試してください。

于 2016-08-23T08:50:35.433 に答える