# README
jsonquery
Overview
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.
Getting Started
Install Package
go get github.com/antchfx/jsonquery
Load JSON document from URL.
doc, err := jsonquery.LoadURL("http://www.example.com/feed?json")
Load JSON document from string.
s :=`{
"name":"John",
"age":31,
"city":"New York"
}`
doc, err := jsonquery.Parse(strings.NewReader(s))
Load JSON document from io.Reader.
f, err := os.Open("./books.json")
doc, err := jsonquery.Parse(f)
Find authors of all books in the store.
list := jsonquery.Find(doc, "store/book/*/author")
// or equal to
list := jsonquery.Find(doc, "//author")
// or by QueryAll()
nodes, err := jsonquery.QueryAll(doc, "//a")
Find the third book.
book := jsonquery.Find(doc, "//book/*[3]")
Find the last book.
book := jsonquery.Find(doc, "//book/*[last()]")
Find all books that have an isbn number.
list := jsonquery.Find(doc, "//book/*[isbn]")
Find all books priced less than 10.
list := jsonquery.Find(doc, "//book/*[price<10]")
Examples
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())
}
}
Implement Principle
If you are familiar with XPath and XML, you can easily figure out how to 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.
List of XPath query packages
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 |
# Functions
CreateXPathNavigator creates a new xpath.NodeNavigator for the specified html.Node.
Find is like QueryAll but will panics if `expr` cannot be parsed.
FindOne is like Query but will panics if `expr` cannot be parsed.
LoadURL loads the JSON document from the specified URL.
Parse JSON document.
No description provided by the author
Query searches the Node that matches by the specified XPath expr, and returns first element of matched.
QueryAll searches the Node that matches by the specified XPath expr.
QuerySelector returns the first matched XML Node by the specified XPath selector.
QuerySelectorAll searches all of the Node that matches the specified XPath selectors.
# Constants
DocumentNode is a document object that, as the root of the document tree, provides access to the entire XML document.
ElementNode is an element.
TextNode is the text content of a node.
# Variables
DisableSelectorCache will disable caching for the query selector if value is true.
SelectorCacheMaxEntries allows how many selector object can be caching.
# Structs
A Node consists of a NodeType and some Data (tag name for element nodes, content for text) and are part of a tree of Nodes.
NodeNavigator is for navigating JSON document.
# Type aliases
A NodeType is the type of a Node.