Unmarshall json引用类型

问题描述:

我正试图编写一个工作示例来测试this link的“引用类型”部分。Unmarshall json引用类型

但我无法理解这应该如何工作。我尝试没有成功写的例子提供如下,仅供参考:

package main 

import (
    "fmt" 
    "log" 
    "encoding/json" 
) 

type Foo1 struct { 
    Val  int 
} 

type Foo2 struct { 
    Name string 
} 

type IncomingMsg struct { 
    F1 *Foo1 
    F2 *Foo2 
} 

func main() { 
    b := []byte(`{"F1" : {"Val":13}}`) 
// b := []byte(`{"F2" : {"Name":"Hello"}}`) 

    var msg IncomingMsg 

    err := json.Unmarshal(b, &msg) 
    if err != nil { 
     log.Fatal(err) 
    } 

    if msg.F1 != nil { 
     fmt.Println(msg.F1.Val) 
    } 

    if msg.F2 != nil { 
     fmt.Println(msg.F2.Name) 
    } 
} 

可以将部分你一起去更多的经验,帮助解决这个问题?

编辑:提供的测试已更新,现在按预期工作。谢谢Adam先生提供的答案,它帮助我理解了这个问题! :)

您在您的示例中发布的json看起来像在主体中缺少F1

https://play.golang.org/p/Fl-lhH2y3X

b := []byte(`{"F1":{"Val":13}}`)

+0

它的工作原理,非常感谢你,亚当先生! :)然后,假设你需要在被解码的JSON中包含字段名称以使用文档中引用的这种有用模式?我虽然可以用更通用的方式来做到这一点。 – aicastell

+0

@aicastell,这是所有JSON解串器的工作原理。这只是标准的具体类型映射JSON –

+0

并非所有人都使用这种建议模式,我熟悉C开发,并且在使用cJSON,茉莉花和其他基于C的反序列化器之后,此功能对我来说是全新的。 – aicastell