Categorygithub.com/rocksun/jsonquery
modulepackage
0.0.0-20190809001604-a725452c18e3
Repository: https://github.com/rocksun/jsonquery.git
Documentation: pkg.go.dev

# README

jsonquery

Build Status Coverage Status GoDoc Go Report Card

Overview

jsonquery is an XPath query package for JSON document, lets you extract data from JSON documents through an XPath expression.

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")

Find the third book.

book := jsonquery.Find(doc, "//book/*[3]")

Find the last book.

book := jsonquery.Find(doc, "//book/*[last()]")

Find all books with isbn number.

list := jsonquery.Find(doc, "//book/*[isbn]")

Find all books cheapier than 10.

list := jsonquery.Find(doc, "//book/*[price<10]")

Quick Tutorial

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, _ := jsonquery.Parse(strings.NewReader(s))
	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 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.

List of supported XPath query packages

NameDescription
htmlqueryXPath query package for the HTML document
xmlqueryXPath query package for the XML document
jsonqueryXPath query package for the JSON document

# Functions

CreateXPathNavigator creates a new xpath.NodeNavigator for the specified html.Node.
Find searches the Node that matches by the specified XPath expr.
FindOne searches the Node that matches by the specified XPath expr, and returns first element of matched.
LoadURL loads the JSON document from the specified URL.
Parse JSON document.
No description provided by the author

# 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.

# 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.