2017-02-09 105 views
0

我有一个JSON,我需要用一个结构来提取出来的数据:Golang地图JSON为结构

我想它映射到以下结构:

type Message struct { 
    Name string `json:"name"` 
    Values []struct { 
     Value int `json:"value,omitempty"` 
     Comments int `json:"comments,omitempty"` 
     Likes int `json:"likes,omitempty"` 
     Shares int `json:"shares,omitempty"` 
    } `json:"values"` 
} 

这是我的JSON:

[{ 
     "name": "organic_impressions_unique", 
     "values": [{ 
      "value": 8288 
     }] 
    }, { 
     "name": "post_story_actions_by_type", 
     "values": [{ 
      "shares": 234, 
      "comments": 838, 
      "likes": 8768 
     }] 
    }] 

我的问题是:

  1. 如何结构我的结构?
  2. 如何读取名称,值和注释?

到目前为止,我可以使用下面的代码无法读取数据:

msg := []Message{} 
getJson("https://json.url", msg) 
println(msg[0]) 

的功能的getJSON:

func getJson(url string, target interface{}) error { 
    r, err := myClient.Get(url) 
    if err != nil { 
     return err 
    } 
    defer r.Body.Close() 

    return json.NewDecoder(r.Body).Decode(target) 
} 
+0

有什么问题吗? –

+0

我需要知道如何构造我的结构以及如何读取名称,值和注释等...... –

+0

@JonathonReinhart我想这不是很清楚,我更新了问题 –

回答

2

你的结构是正确的。所有你需要的是爱使用json.Unmarshal功能有一个正确的目标对象,它是Message实例片:[]Message{}

Correct unmarshaling

type Message struct { 
    Name string `json:"name"` 
    Values []struct { 
     Value int `json:"value,omitempty"` 
     Comments int `json:"comments,omitempty"` 
     Likes int `json:"likes,omitempty"` 
     Shares int `json:"shares,omitempty"` 
    } `json:"values"` 
} 

func main() { 
    input := []byte(` 
[{ 
    "name": "organic_impressions_unique", 
    "values": [{ 
     "value": 8288 
    }] 
    }, { 
     "name": "post_story_actions_by_type", 
     "values": [{ 
      "shares": 234, 
      "comments": 838, 
      "likes": 8768 
     }] 
    }] 
`) 

    messages := []Message{} // Slice of Message instances 
    json.Unmarshal(input, &messages) 
    fmt.Println(messages) 
} 
3

你的JSON似乎是一个数组。只是解开它。例如:

var messages []Message 
err := json.Unmarshal(json, &messages) 

应该工作。

+0

'json'里面unmarshal代表什么?网址? –

+0

在我的问题plz中检查getJson函数,现在我添加了它 –

+0

json在unmarshal中代表json blob在你的问题中, – Uvelichitel

0

我不知道这将是任何帮助,现在,但我最近写的实用程序,用于从JSON输入产生精确的走类型:https://github.com/m-zajac/json2go

对于从第一篇文章JSON它生成此结构:

type Object struct { 
    Name string `json:"name"` 
    Values []struct { 
     Comments *int `json:"comments,omitempty"` 
     Likes  *int `json:"likes,omitempty"` 
     Shares  *int `json:"shares,omitempty"` 
     Value  *int `json:"value,omitempty"` 
    } `json:"values"` 
} 

可以解码数据,这个结构是这样的:

var docs []Object 
if err := json.Unmarshal(input, &docs); err != nil { 
    // handle error 
}