【问题标题】:Add to array from json and execute data in template从json添加到数组并在模板中执行数据
【发布时间】:2015-08-28 10:31:54
【问题描述】:

我有一个小问题!

如何从 json 添加到数组数据并执行模板。简单的。但不工作!

package main

import (
    "fmt"
    "html/template"
    "os"
    "encoding/json"
)

type Person struct {
    Name   string
    Jobs   []*Job
}

type Job struct {
    Employer string
    Role     string
}

const templ = `The name is {{.Name}}.

{{with .Jobs}}
    {{range .}}
        An employer is {{.Employer}}
        and the role is {{.Role}}
    {{end}}
{{end}}
`

func main() {
    job1 := Job{Employer: "Monash", Role: "Honorary"}
    job2 := Job{Employer: "Box Hill", Role: "Head of HE"}

    byt := []byte(`{"num":6.13,"Jobs":[{"Employer": "test1", "Role": "test1"},{"Employer": "test2", "Role": "test2"}]}`)

    var dat map[string]interface{}

    if err := json.Unmarshal(byt, &dat); err != nil {
             panic(err)
        }
        fmt.Println(dat)




    // HOW ADD FROM ARRAY 'dat' TO STRUCT 'Job'
    // LINE 54




    person := Person{
        Name:   "jan",
        Jobs:   []*Job{&job1, &job2},
    }

    t := template.New("Person template")
    t, err := t.Parse(templ)
    checkError(err)

    err = t.Execute(os.Stdout, person)
    checkError(err)
}





func checkError(err error) {
    if err != nil {
        fmt.Println("Fatal error ", err.Error())
        os.Exit(1)
    }
}

在这里你可以玩/测试代码:http://play.golang.org/p/AB8hGLrLRy

观察第 46 行。

非常感谢!

【问题讨论】:

  • 太棒了!这就是我要的!非常感谢!小问题一点点;)
  • 太棒了!这就是我要的!非常感谢!小问题一点点;)当我从文件中读取json时。如果我打印 json 文件:[{test1 test1}] 好的,转换为字节:byt := []byte(config.Social) 它键入:cannot convert config.Social (type []struct { Employer string "json:\"url\""; Title string "json:\"Role\"" }) to type []byte
  • 你想达到什么目的?您想将您的结构编组为字节数组吗?请举个例子

标签: templates go render


【解决方案1】:

首先,您的 dat var 类型不正确。你应该有这样的东西:

dat := struct {
    Jobs []*Job
}

这样,当您将 JSON 字符串解组为 dat 时,Jobs 键将填充一个由您的数据数组初始化的 *Job 数组。 我使用的是匿名结构,但您也可以有一个命名结构(参见@RoninDev 的评论示例)。

然后,只需将它们添加到 person 数组中,如下所示:

person.Jobs = append(person.Jobs, jobs.Jobs...)

注意... 运算符,它使用数组作为可变参数。

您可以在 playground 上查看完整的工作代码。

【讨论】:

  • 这仍然不能完全准确地表示他的数据。
  • 就够了,剩下的属性他不用了。
  • 是的,这是真的,不需要其他属性。我认为值得详细说明,因为 OP 的问题是由于不了解 json 的结构和/或它在 Go 中的建模方式而引起的。
【解决方案2】:

您可以很好地解组 json,它只是该语言提供的最模糊的类型...您可以使用一系列类型断言将其拆箱,但我不推荐它。 json 可以很容易地在 Go 中建模,结构如下所示;

type Wrapper struct {
    Num float64 `json:"num"`
    Jobs []*Job  `json:"Jobs"`
}

这是使用该结构的代码的更新示例; http://play.golang.org/p/aNLK_Uk2km

反序列化它们后,您可以使用append 将它们添加到人员对象中的作业数组中,例如person.Jobs = append(person.Jobs, dat.Jobs...)

【讨论】:

  • 我认为jobs := dat["Jobs"].([]Job) 会失败,因为将interface{} 解组为[]type 不是单一操作...
  • @Elwinar 是的,确实如此,拆箱数据实际上还有很多工作要做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多