jsonquery is an XPath query package for JSON document, lets you extract data from JSON documents through an XPath expression. Built-in XPath expression cache avoid re-compile XPath expression each query.
go get github.com/antchfx/jsonquery
doc, err := jsonquery.LoadURL("http://www.example.com/feed?json")
s :=`{
"name":"John",
"age":31,
"city":"New York"
}`
doc, err := jsonquery.Parse(strings.NewReader(s))
f, err := os.Open("./books.json")
doc, err := jsonquery.Parse(f)
list := jsonquery.Find(doc, "store/book/*/author")
// or equal to
list := jsonquery.Find(doc, "//author")
// or by QueryAll()
nodes, err := jsonquery.QueryAll(doc, "//a")
book := jsonquery.Find(doc, "//book/*[3]")
book := jsonquery.Find(doc, "//book/*[last()]")
list := jsonquery.Find(doc, "//book/*[isbn]")
list := jsonquery.Find(doc, "//book/*[price<10]")
func main() {
s := `{
"name": "John",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}`
doc, err := jsonquery.Parse(strings.NewReader(s))
if err != nil {
panic(err)
}
name := jsonquery.FindOne(doc, "name")
fmt.Printf("name: %s\n", name.InnerText())
var a []string
for _, n := range jsonquery.Find(doc, "phoneNumbers/*/number") {
a = append(a, n.InnerText())
}
fmt.Printf("phone number: %s\n", strings.Join(a, ","))
if n := jsonquery.FindOne(doc, "address/streetAddress"); n != nil {
fmt.Printf("address: %s\n", n.InnerText())
}
}
If you are familiar with XPath and XML, you can quick start to known how write your XPath expression.
{
"name":"John",
"age":30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ "320", "X3", "X5" ] },
{ "name":"Fiat", "models":[ "500", "Panda" ] }
]
}
The above JSON document will be convert to similar to XML document by the JSONQuery, like below:
<name>John</name>
<age>30</age>
<cars>
<element>
<name>Ford</name>
<models>
<element>Fiesta</element>
<element>Focus</element>
<element>Mustang</element>
</models>
</element>
<element>
<name>BMW</name>
<models>
<element>320</element>
<element>X3</element>
<element>X5</element>
</models>
</element>
<element>
<name>Fiat</name>
<models>
<element>500</element>
<element>Panda</element>
</models>
</element>
</cars>
Notes: element
is empty element that have no any name.
Name | Description |
---|---|
htmlquery | XPath query package for the HTML document |
xmlquery | XPath query package for the XML document |
jsonquery | XPath query package for the JSON document |