2015-08-28 49 views
-1

我有一点点qiestion!从json添加到数组并在模板中执行数据

如何从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

非常感谢您!

+0

这? http://play.golang.org/p/EZJt-y-mMJ – RoninDev

+0

太棒了!这就是我要的!非常感谢你! 小问题一点点;) – Gopher

+0

太棒了!这就是我要的!非常感谢你! 小问题一点点;) 当我从文件读取json。如果我打印json文件:'[{test1 test1}]' 好吧,转换为字节: 'byt:= [] byte(config.Social)' 它的类型如下: '不能转换config.Social(type [ ] struct {Employer string“json:\”url \“”;标题字符串“json:\”Role \“”})键入[] byte' – Gopher

回答

0

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

dat := struct { 
    Jobs []*Job 
} 

这样一来,你的反编组JSON字符串成dat时,该Jobs键将充满你的数据的数组初始化*Job一个阵列。 我使用了一个匿名结构,但你也可以有一个命名结构(参见@ RoninDev的例子)。

然后,只需将它们添加到阵列的人,喜欢的东西:

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

注意...运营商,它使用数组作为可变参数的参数。

您可以在此看到完整的工作代码playground

+0

这还不能完全准确地表示他的数据。 – evanmcdonnal

+0

它足够了,他不使用剩余的属性。 – Elwinar

+0

是的,这是真的,其他的财产是不需要的。我认为这是值得详细的,因为OP的问题是由于不了解JSON的结构和/或它如何在Go中建模而引起的。 – evanmcdonnal

0

你正在解组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...)

+0

我认为'jobs:= dat [“Jobs”]。([] Job)'会失败,因为'interface {}'解组到'[]类型'不是一个单独的操作... – Elwinar

+0

@Elwinar yeah这就是没错,实际上还需要更多的工作来解开这些数据。 – evanmcdonnal

相关问题