JSONSelect Build Status

CSS-like selectors for JSON.

More info about the JSON:select format

Installation

From your terminal:

gem install json_select

In your Gemfile:

gem 'json_select'

Usage

require 'json_select'

json = { # This would normally be loaded with something like yajl-ruby
  "name" => {
    "first" => "Lloyd",
    "last" => "Hilaiel"
  },
  "favoriteColor" => "yellow",
  "languagesSpoken" => [
    {
      "language" => "Bulgarian",
      "level" => "advanced"
    },
    {
      "language" => "English",
      "level" => "native"
    },
    {
      "language" => "Spanish",
      "level" => "beginner"
    }
  ],
  "seatingPreference" => [ "window", "aisle" ],
  "drinkPreference" => [ "beer", "whiskey", "wine" ],
  "weight" => 172
}

JSONSelect('string:first-child').test(json)    # => true
JSONSelect('string:first-child').match(json)   # => "window"
JSONSelect('string:first-child').matches(json) # => ["window", "beer"]

Language support

✓ — Level 1*
Any node

✓ — Level 1T
A node of type T, where T is one string, number, object, array, boolean, or null

✓ — Level 1T.key
A node of type T which is the child of an object and is the value its parents key property

✓ — Level 1T."complex key"
Same as previous, but with property name specified as a JSON string

✓ — Level 1T:root
A node of type T which is the root of the JSON document

✓ — Level 1T:nth-child(n)
A node of type T which is the nth child of an array parent

✓ — Level 2T:nth-last-child(n)
A node of type T which is the nth child of an array parent counting from the end

✓ — Level 1T:first-child
A node of type T which is the first child of an array parent (equivalent to T:nth-child(1))

✓ — Level 2T:last-child
A node of type T which is the last child of an array parent (equivalent to T:nth-last-child(1))

✓ — Level 2T:only-child
A node of type T which is the only child of an array parent

✓ — Level 2T:empty
A node of type T which is an array or object with no child

✓ — Level 1T U
A node of type U with an ancestor of type T

✓ — Level 1T > U
A node of type U with a parent of type T

✗ — Level 2T ~ U
A node of type U with a sibling of type T

✓ — Level 1S1, S2
Any node which matches either selector S1 or S2

✗ — Level 3T:has(S)
A node of type T which has a child node satisfying the selector S

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with Rakefile or version. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright (c) 2011 Simon Menke. See LICENSE for details.