GitHub - RichardKnop/jsonhal: A simple Go package to make custom structs marshal into HAL compatible JSON responses. (original) (raw)

A simple Go package to make custom structs marshal into HAL compatible JSON responses.

Just add jsonhal.Hal as anonymous field to your structs and use SetLink to set hyperlinks and optionally SetEmbedded to set embedded resources.

package main

import ( "encoding/json" "log"

"github.com/RichardKnop/jsonhal"

)

// HelloWorld ... type HelloWorld struct { jsonhal.Hal ID uint json:"id" Name string json:"name" }

// Foobar ... type Foobar struct { jsonhal.Hal ID uint json:"id" Name string json:"name" }

func main() { var ( helloWorld *HelloWorld jsonResponse []byte err error )

helloWorld = &HelloWorld{ID: 1, Name: "Hello World"}
helloWorld.SetLink("self", "/v1/hello/world/1", "")

jsonResponse, err = json.Marshal(helloWorld)
if err != nil {
    log.Fatal(err)
}
log.Print(string(jsonResponse))
// {
// 	"_links": {
// 		"self": {
// 			"href": "/v1/hello/world/1"
// 		}
// 	},
// 	"id": 1,
// 	"name": "Hello World"
// }

helloWorld = &HelloWorld{ID: 1, Name: "Hello World"}
helloWorld.SetLink(
    "self", // name
    "/v1/hello/world?offset=2&limit=2", // href
    "", // title
)
helloWorld.SetLink(
    "next", // name
    "/v1/hello/world?offset=4&limit=2", // href
    "", // title
)
helloWorld.SetLink(
    "previous",                         // name
    "/v1/hello/world?offset=0&limit=2", // href
    "", // title
)
jsonResponse, err = json.Marshal(helloWorld)
if err != nil {
    log.Fatal(err)
}
log.Print(string(jsonResponse))
// {
// 	"_links": {
// 		"next": {
// 			"href": "/v1/hello/world?offset=4\u0026limit=2"
// 		},
// 		"previous": {
// 			"href": "/v1/hello/world?offset=0\u0026limit=2"
// 		},
// 		"self": {
// 			"href": "/v1/hello/world?offset=2\u0026limit=2"
// 		}
// 	},
// 	"id": 1,
// 	"name": "Hello World"
// }

helloWorld = &HelloWorld{ID: 1, Name: "Hello World"}
helloWorld.SetLink("self", "/v1/hello/world/1", "")

// Add embedded resources
foobars := []*Foobar{
    &Foobar{
        Hal: jsonhal.Hal{
            Links: map[string]*jsonhal.Link{
                "self": &jsonhal.Link{Href: "/v1/foo/bar/1"},
            },
        },
        ID:   1,
        Name: "Foo bar 1",
    },
    &Foobar{
        Hal: jsonhal.Hal{
            Links: map[string]*jsonhal.Link{
                "self": &jsonhal.Link{Href: "/v1/foo/bar/2"},
            },
        },
        ID:   2,
        Name: "Foo bar 2",
    },
}
helloWorld.SetEmbedded("foobars", Embedded(foobars))

jsonResponse, err = json.Marshal(helloWorld)
if err != nil {
    log.Fatal(err)
}
log.Print(string(jsonResponse))
// {
// 	"_links": {
// 		"self": {
// 			"href": "/v1/hello/world/1"
// 		}
// 	},
// 	"_embedded": {
// 		"foobars": [
// 			{
// 				"_links": {
// 					"self": {
// 						"href": "/v1/foo/bar/1"
// 					}
// 				},
// 				"id": 1,
// 				"name": "Foo bar 1"
// 			},
// 			{
// 				"_links": {
// 					"self": {
// 						"href": "/v1/foo/bar/2"
// 					}
// 				},
// 				"id": 2,
// 				"name": "Foo bar 2"
// 			}
// 		]
// 	},
// 	"id": 1,
// 	"name": "Hello World"
// }

}