jsonhal
Simple Go package to make custom structs marshal into HAL compatible JSON responses
About jsonhal
jsonhal
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.
Example:
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"
// }
}
Frequently Asked Questions
What is jsonhal?
jsonhal is a JSON library for the Go programming language. Simple Go package to make custom structs marshal into HAL compatible JSON responses
How do I install jsonhal?
Install jsonhal with the Go module system using `go get RichardKnop/jsonhal`. Check the repository for the current installation instructions.
What category does jsonhal belong to?
jsonhal is listed under JSON, specifically JSON.