用Go解析复杂的JSON

问题描述:

我遇到的问题是用Go解析一些嵌套的JSON。我的主要问题是,我无法正确建模我的结构,试图让图书馆获取任何信息。以下是JSON数据的示例:http://pastebin.com/fcGQqi5z用Go解析复杂的JSON

该数据来自银行,已被清理隐私。理想情况下,我只对交易ID,金额和描述感兴趣。有没有办法只用Go来拉这些值?

这是我最初的尝试:

type Trans struct { 
    TransId string 
    Amount int 
    Description string 
} 
+0

你可以发布有效的json,可以很容易地复制/粘贴? – OneOfOne 2014-10-03 14:41:58

+0

使用有效的Json更新了pastebin – 2014-10-03 14:50:07

你是对的轨道:

type Trans struct { 
    TransId  string 
    Amount  float64 
    Description string 
} 

func main() { 
    var data struct { 
     Record []Trans 
    } 
    if err := json.Unmarshal([]byte(j), &data); err != nil { 
     fmt.Println(err) 
     return 
    } 
    fmt.Printf("%#v\n", data.Record) 
} 

playground

//编辑

type Trans struct { 
    TransId  string 
    Amount  float64 
    Description string 
    RawInfo  []map[string]json.RawMessage `json:"AdditionalInfo"` 
} 

// also this assumes that 1. all data are strings and 2. they have unique keys 
// if this isn't the case, you can use map[string][]string or something 
func (t *Trans) AdditionalInfo() (m map[string]string) { 
    m = make(map[string]string, len(t.RawInfo)) 
    for _, info := range t.RawInfo { 
     for k, v := range info { 
      m[k] = string(v) 
     } 
    } 
    return 
} 

playground

+0

由于Amount和Description嵌套在“AdditionalInfo”中,分析器如何知道如何在不明确告诉它们位于“AdditionalInfo”内的情况下如何获取? – 2014-10-03 15:11:42

+0

@JoshuaGilman他们不是嵌套在你给的例子中? – OneOfOne 2014-10-03 15:22:19

+0

我站好了。只是为了学习,我如何将“AdditionalInfo”中的任何细节合并? – 2014-10-03 15:28:52

type Records struct { 
    Records []Record `json:"record"` 
} 

type Record struct { 
    TransId string 
    Amount float64 
    Description string 
} 

func main() { 
    r := Records{} 
    if err := json.Unmarshal([]byte(data), &r); err != nil { 
     log.Fatal(err) 
    } 

    fmt.Println(r) 
}