2017-03-15 80 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