-
Notifications
You must be signed in to change notification settings - Fork 571
Using native JSON parsing to realize a slim JSON decoder
shaban edited this page Jan 4, 2018
·
5 revisions
Sometimes it is undesirable to use the stdlib JSON library especially if your use case necessitates a small filesize.
This small example is meant to highlight some of the advanced features of gopherjs.
By writing a small wrapper around the parsed JSON data it is possible to write a convenient data store built around JSON received from a REST server.
By using json:"property" struct tags you can conveniently use the stdlib json library serverside and then reuse your structs clientside with the `js:"property" struct tag. Of course it is also possible to use sql struct tags if that is where your data server side comes from.
package main
import "github.com/gopherjs/gopherjs/js"
const json = `{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "href": "/new"},
{"value": "Open", "href": "/open"},
{"value": "Close", "href": "/close"}
]
}
}}`
type MenuItem struct {
raw *js.Object
Value string `js:"value"`
Href string `js:"href"`
}
type Popup struct {
raw *js.Object
MenuItems []*MenuItem `js:"menuitem"`
}
type Menu struct {
raw *js.Object
ID string `js:"id"`
Value string `js:"value"`
Popup *Popup `js:"popup"`
}
func ParseJSON(responseText string) *js.Object {
return js.Global.Get("JSON").Call("parse", responseText)
}
func main() {
obj := ParseJSON(json)
if obj == nil {
println("Oops soemthing went wrong")
return
}
menuJS := obj.Get("menu")
if menuJS == nil {
println("Oops no menu")
return
}
m := &Menu{raw: menuJS}
println(m.Popup.MenuItems[1].Value)
}