Joe Bergevin Joe Bergevin - 2 months ago 20
JSON Question

Go/Golang, Flatten a Nested JSON

Trying to flatten a nested json response from 2 levels deep down to 1.

Here is my working code on Go Playground: http://play.golang.org/p/kHAYuZUTko

I want to end up with:

type Social struct {
GooglePlusPlusOnes uint32 `Social:"GooglePlusOne"`
TwitterTweets uint32 `json:"Twitter"`
LinkedinShares uint32 `json:"LinkedIn"`
PinterestPins uint32 `json:"Pinterest"`
StumbleuponStumbles uint32 `json:"StumbleUpon"`
DeliciousBookmarks uint32 `json:"Delicious"`
FacebookLikes uint32 `json:"??some_magical_nested_address??"`
FacebookShares uint32 `json:"??some_magical_nested_address??"`
FacebookComments uint32 `json:"??some_magical_nested_address??"`
FacebookTotal uint32 `json:"??some_magical_nested_address??"`
}


...instead of a
Social
type containing a nested
Facebook
type (seen in the code below).

I suspect I'll need to do a custom
UnmarshalJSON
function, but I don't know how those work and I'm new to Go.

Suggestions?




Here is the code from the Go Playground link above:

package main

import (
"encoding/json"
"fmt"
)

type Social struct {
GooglePlusPlusOnes uint32 `json:"GooglePlusOne"`
TwitterTweets uint32 `json:"Twitter"`
LinkedinShares uint32 `json:"LinkedIn"`
PinterestPins uint32 `json:"Pinterest"`
StumbleuponStumbles uint32 `json:"StumbleUpon"`
DeliciousBookmarks uint32 `json:"Delicious"`
Facebook Facebook
}

type Facebook struct {
FacebookLikes uint32 `json:"like_count"`
FacebookShares uint32 `json:"share_count"`
FacebookComments uint32 `json:"comment_count"`
FacebookTotal uint32 `json:"total_count"`
}

func main() {
var jsonBlob = []byte(`[
{"StumbleUpon":0,"Reddit":0,"Facebook":{"commentsbox_count":4691,"click_count":0,"total_count":298686,"comment_count":38955,"like_count":82902,"share_count":176829},"Delicious":0,"GooglePlusOne":275234,"Buzz":0,"Twitter":7346788,"Diggs":0,"Pinterest":40982,"LinkedIn":0}
]`)

var social []Social
err := json.Unmarshal(jsonBlob, &social)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v", social)
}

Answer

You can simply embed the Facebook struct:

type Social struct {
    .....
    Facebook            `json:"Facebook"`
}

Then access it like:

social.FacebookLikes

Working example: http://play.golang.org/p/xThhX_92Sg