This library surfaces a simple API for serializing/deserializing JSONAPI documents.
package main
import (
"fmt"
"os"
"github.com/ryanmoran/jsonapi"
)
type Article struct {
ID string
Title string `jsonapi:"title"`
Body string `jsonapi:"body"`
}
func (a Article) Type() string {
return "article"
}
func (a Article) Primary() string {
return a.ID
}
func main() {
content, err := jsonapi.Marshal(Article{
ID: "1",
Title: "JSON:API paints my bikeshed!",
Body: "The shortest article. Ever.",
})
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(string(content))
}
go run main.go
{
"data": {
"type": "article",
"id": "1",
"attributes": {
"body": "The shortest article. Ever.",
"title": "JSON:API paints my bikeshed!"
}
}
}
package main
import (
"fmt"
"io/ioutil"
"os"
"github.com/ryanmoran/jsonapi"
)
type Article struct {
ID string
Title string `jsonapi:"title"`
Body string `jsonapi:"body"`
AuthorID string
}
func (a Article) Type() string {
return "article"
}
func (a Article) Primary() string {
return a.ID
}
func (a *Article) SetPrimary(id string) {
a.ID = id
}
func main() {
content, err := ioutil.ReadAll(os.Stdin)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
var article Article
err = jsonapi.Unmarshal(content, &article)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("%#v\n", article)
}
echo '{
"data": {
"type": "article",
"id": "1",
"attributes": {
"body": "The shortest article. Ever.",
"title": "JSON:API paints my bikeshed!"
}
}
}' | go run main.go
main.Article{ID:"1", Title:"JSON:API paints my bikeshed!", Body:"The shortest article. Ever.", AuthorID:""}
package main
import (
"fmt"
"os"
"github.com/ryanmoran/jsonapi"
)
type Article struct {
ID string
Title string `jsonapi:"title"`
Body string `jsonapi:"body"`
}
func (a Article) Type() string {
return "article"
}
func (a Article) Primary() string {
return a.ID
}
func main() {
content, err := jsonapi.Marshal([]Article{
{
ID: "1",
Title: "JSON:API paints my bikeshed!",
Body: "The shortest article. Ever.",
},
{
ID: "2",
Title: "Following up on that short article...",
Body: "This article is also pretty short.",
},
})
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(string(content))
}
go run main.go
{
"data": [
{
"type": "article",
"id": "1",
"attributes": {
"body": "The shortest article. Ever.",
"title": "JSON:API paints my bikeshed!"
}
},
{
"type": "article",
"id": "2",
"attributes": {
"body": "This article is also pretty short.",
"title": "Following up on that short article..."
}
}
]
}
package main
import (
"fmt"
"os"
"github.com/ryanmoran/jsonapi"
)
type Article struct {
ID string
Title string `jsonapi:"title"`
Body string `jsonapi:"body"`
AuthorID string
}
func (a Article) Type() string {
return "article"
}
func (a Article) Primary() string {
return a.ID
}
func (a Article) Links() []jsonapi.Link {
return []jsonapi.Link{
{
Name: "self",
Href: "/articles/1",
},
}
}
func (a Article) Relationships() []jsonapi.Relationship {
return []jsonapi.Relationship{
{
Name: "author",
Type: jsonapi.SingularRelationship,
Resource: Person{
ID: "42",
},
},
}
}
func (a Article) Meta() jsonapi.Meta {
return jsonapi.Meta{
"views": 100
}
}
type Person struct {
ID string
}
func (p Person) Type() string {
return "person"
}
func (p Person) Primary() string {
return p.ID
}
func main() {
content, err := jsonapi.Marshal(Article{
ID: "1",
Title: "JSON:API paints my bikeshed!",
Body: "The shortest article. Ever.",
AuthorID: "42",
})
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(string(content))
}
go run main.go
{
"data": {
"type": "article",
"id": "1",
"attributes": {
"body": "The shortest article. Ever.",
"title": "JSON:API paints my bikeshed!"
},
"links": {
"self": {
"href": "/articles/1"
}
},
"relationships": {
"author": {
"data": {
"type": "person",
"id": "42"
}
}
},
"meta": {
"views": 100
}
}
}
package main
import (
"fmt"
"io/ioutil"
"os"
"github.com/ryanmoran/jsonapi"
)
type Article struct {
ID string
Title string `jsonapi:"title"`
Body string `jsonapi:"body"`
AuthorID string
}
func (a Article) Type() string {
return "article"
}
func (a Article) Primary() string {
return a.ID
}
func (a *Article) SetPrimary(id string) {
a.ID = id
}
func (a *Article) AssignRelationships(relationships []jsonapi.Relationship) {
for _, relationship := range relationships {
if relationship.Name == "author" {
a.AuthorID = relationship.Resource.Primary()
}
}
}
func main() {
content, err := ioutil.ReadAll(os.Stdin)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
var article Article
err = jsonapi.Unmarshal(content, &article)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("%#v\n", article)
}
echo '{
"data": {
"type": "article",
"id": "1",
"attributes": {
"body": "The shortest article. Ever.",
"title": "JSON:API paints my bikeshed!"
},
"links": {
"self": {
"href": "/articles/1"
}
},
"relationships": {
"author": {
"data": {
"type": "person",
"id": "42"
}
}
}
}
}
' | go run main.go
main.Article{ID:"1", Title:"JSON:API paints my bikeshed!", Body:"The shortest article. Ever.", AuthorID:"42"}