Search results

There are no results.

std.json.Query

class pub Query

A type used to query/fetch data from a JSON value.

Manually extracting values from JSON objects can be cumbersome. Take the following JSON for example:

{
  "name": "Alice",
  "address": {
    "street": "Sesame Street"
  }
}

If we want to get the value of the street key, we'd have to write the following:

match json {
  case Object(root) -> match root.opt('address') {
    case Some(Object(addr)) -> match addr.opt('street') {
      case Some(String(v)) -> Option.Some(v)
      case _ -> Option.None
    }
    case _ -> Option.None
  }
  case _ -> Option.None
}

In contrast, using the Query type we can instead write the following:

json.query.key('address').key('street').as_string

Querying is done using the methods Query.key to get an object key's value, and Query.index to get the value of an array index. Methods such as Query.as_string and Query.as_int are used to extract the final value as a certain type, if such a value is present.

Instance methods

as_array

Show source code
Hide source code
fn pub move as_array -> Option[ref Array[Json]] {
  match @value {
    case Some(Array(v)) -> Option.Some(v)
    case _ -> Option.None
  }
}
fn pub move as_array -> Option[ref Array[Json]]

Returns the value self matches against if it's an Array.

Examples

import std.json (Json)

Json.Array([Json.Int(42)]).query.as_array # => Option.Some(...)
Json.Int(42).query.as_array               # => Option.None

as_bool

Show source code
Hide source code
fn pub move as_bool -> Option[Bool] {
  match @value {
    case Some(Bool(v)) -> Option.Some(v)
    case _ -> Option.None
  }
}
fn pub move as_bool -> Option[Bool]

Returns the value self matches against if it's a Bool.

Examples

import std.json (Json)

Json.String('test').query.as_bool # => Option.None
Json.Bool(true).query.as_bool     # => Option.Some(true)

as_float

Show source code
Hide source code
fn pub move as_float -> Option[Float] {
  match @value {
    case Some(Float(v)) -> Option.Some(v)
    case _ -> Option.None
  }
}
fn pub move as_float -> Option[Float]

Returns the value self matches against if it's a Float.

Examples

import std.json (Json)

Json.String('test').query.as_float # => Option.None
Json.Float(42.0).query.as_float    # => Option.Some(42.0)

as_int

Show source code
Hide source code
fn pub move as_int -> Option[Int] {
  match @value {
    case Some(Int(v)) -> Option.Some(v)
    case _ -> Option.None
  }
}
fn pub move as_int -> Option[Int]

Returns the value self matches against if it's an Int.

Examples

import std.json (Json)

Json.String('test').query.as_int # => Option.None
Json.Int(42).query.as_int        # => Option.Some(42)

as_object

Show source code
Hide source code
fn pub move as_object -> Option[ref Map[String, Json]] {
  match @value {
    case Some(Object(v)) -> Option.Some(v)
    case _ -> Option.None
  }
}
fn pub move as_object -> Option[ref Map[String, Json]]

Returns the value self matches against if it's an Object.

Examples

import std.json (Json)

let map = Map.new

map.set('name', 'Alice')
Json.Object(map).query.as_object # => Option.Some(...)
Json.Int(42).query.as_object     # => Option.None

as_string

Show source code
Hide source code
fn pub move as_string -> Option[String] {
  match @value {
    case Some(String(v)) -> Option.Some(v)
    case _ -> Option.None
  }
}
fn pub move as_string -> Option[String]

Returns the value self matches against if it's a String.

Examples

import std.json (Json)

Json.Int(42).query.as_string        # => Option.None
Json.String('test').query.as_string # => Option.Some('test')

index

Show source code
Hide source code
fn pub move index(index: Int) -> Query {
  @value = match ref @value {
    case Some(Array(v)) -> v.opt(index)
    case _ -> Option.None
  }

  self
}
fn pub move index(index: Int) -> Query

Returns a Query that matches the value assigned to the array index index, if the current value the query matches against is an array.

Examples

import std.json (Json)

Json.Array([Json.Int(10)]).query.index(0).as_int # => Option.Some(10)
Json.Int(42).query.index(0).as_int               # => Option.None

key

Show source code
Hide source code
fn pub move key(name: String) -> Query {
  @value = match ref @value {
    case Some(Object(v)) -> v.opt(name)
    case _ -> Option.None
  }

  self
}
fn pub move key(name: String) -> Query

Returns a Query that matches the value assigned to the object key name, if the current value the query matches against is an object.

Examples

import std.json (Json)

let map = Map.new

map.set('name', 'Alice')
Json.Object(map).query.key('name').as_string # => Option.Some('alice')
Json.Int(42).query.key('name').as_string     # => Option.None