2017-03-15 66 views
2

所以我試圖分析JSON到一些結構和工程確定以下各項:地圖結構從JSON在Golang

type train struct { 
ID  string `json:"id"` 
Price float64 `json:"price,string"` 
Distance float64 `json:"Distance,string"` 
} 

type Station struct { 
ID  int64 `json:"id,string"` 
arrTrain []train`json:"arr"` 
depTrain []train`json:"dep"` 
} 

但問題是,我想能夠輕鬆要使用它們的ID引用arrTrain和depTrain中的項目,所以我認爲我需要更改Station結構以arrTrain和depTrain作爲以ID爲關鍵字的映射。這是可能的時候解析的JSON或它必須'後處理'?

編輯: 作爲一個評論說,不幸的是我的JSON是以下形式:

{ 
    "id":1, 
    "arr": [ 
    {"id":"one","price":"$10.1","Distance":"100km"}, 
    {...} 
    ], 
    "dep":[ 
    {"id":"one","price":"$10.1","Distance":"100km"}, 
    {...} 
    ] 
} 

換句話說,ID是不是在JSON對象之外,arrTrain是列表。

+1

我嘗試了下面的一些答案,似乎在結構內形成的地圖不被json.Marshal識別/丟失 - [playground](https://play.golang.org/p/5-yQvqi14Q ) – Conner

+1

使這些字段可導出https://play.golang.org/p/x8TOcjcj7T – Treesrule14

回答

2

是的,你可以定義站這樣的:

type Station struct { 
    ID  int64   `json:"id,string"` 
    arrTrain map[string]train `json:"arr"` 
    depTrain map[string]train `json:"dep"` 
} 

和你的JSON應該喜歡這樣的

{ 
    "id":1, 
    "arr": { 
    "one":{"id":"one","price":"$10.1","Distance":"100km"}, 
    "two":... 
    }, 
    "dep":{ 
    "one":{"id":"one","price":"$10.1","Distance":"100km"}, 
    "two":... 
    } 
} 
+0

啊,我明白了,謝謝。不幸的是,我的json的形式是「arr」:[{},{}],即密鑰不在單個項目之外。 – RexFuzzle

+0

@RexFuzzle基於這些信息,我認爲最好的方法是爲Station結構定義UnmarshalJSON函數。 – netdigger

+0

@netdigger看到我的答案,但使字段名稱大寫。 –

0

編輯:是的,你可以。 (這個答案的早期版本稱鍵只能是字符串,但由於1.7這是不正確的)

您可以在行動中看到這個with this playground

另外,作爲康納在評論中指出的字段名稱將必須導出編碼/ JSON工作

type Station struct { 
    ID  int64   `json:"id,string"` 
    ArrTrain map[string]train `json:"arr"` 
    DepTrain map[string]train `json:"dep"` 
} 
+2

因爲1.7'encoding/json'支持具有整數類型或實現'encoding.TextMarhsaler/TextUnmarshaler'接口的鍵的映射鍵。 [發佈說明](https://golang.org/doc/go1.7#encoding_json),[提交](https://github.com/golang/go/commit/f05c3aa24d815cd3869153750c9875e35fc48a6e) – mkopriva