You are looking at historical revision 29367 of this page. It may differ significantly from its current revision.

json-rpc

Description

An implementation of the JSON-RPC 2.0 protocol.

Note: There is only a client implementation for now.

With this egg you can setup a connection to a JSON-RPC server and send JSON-RPC valid JSON without the overhead of having to build the correctly formatted JSON string yourself.

Author

Tim van der Linden

Requirements

Repository

The code is hosted on an external repository and can be found here:

Documentation and examples

Client

[procedure] (json-rpc-server INPUT-PORT OUTPUT-PORT STRING)
Short explanation

In short, this will return a procedure that accepts a method (as a STRING) and optional params (as KEYWORD ARGUMENTS).

Once called, this method will send a valid JSON-RPC formatted string to the server. A response or error object can be read out from the specified output port.

And in more detail

You can define the connection to your JSON-RPC server with the above procedure.

When defining your connection, you have to give an OUTPUT PORT and INPUT PORT as well as a STRING containing the JSON-RPC version. This implementation is made for version 2.0, so this version string will always be "2.0" (until a new version of JSON-RPC is released).

For demonstration purposes: Let's define a connection to a XBMC media center, which uses JSON-RPC for its remote calls:

(define xbmc
  (json-rpc-server input output "2.0"))

Once setup, this will return a procedure that accepts a method and optional params. You can then call this procedure to actually send a valid JSON-RPC formatted string to the server. Lets ask the server for a listing of the current active players:

(xbmc "Player.GetActivePlayers")

This will build the following CHICKEN data object:

((jsonrpc . 2.0)
 (method . Player.GetActivePlayers)
 (id . 1))

Then it will get formatted to valid JSON and send to the server.

The transformation from CHICKEN to JSON (and back) is done trough the wonderful Medea.

You can optionally include params to be send with your method. The JSON-RPC spec defines two types of params:

Let's see this in action on the same XBMC connection.

Take, for instance, sending a command to play or pause your XBMC box. Here you not only need to send the method, but also send which player you wish to pause or play. This would look something like this:

(xbmc "Player.PlayPause" playerid: 0)

Which will be represented like so:

((jsonrpc . 2.0)
 (method . Player.PlayPause)
 (params (playerid . 0))
 (id . 1))

And finally, you can nest your params. We now want to know the title, album and artist of a certain playlist. For this we can use a vector inside a listing of keyword arguments:

(xbmc "Playlist.GetItems" properties: '#("title" "album" "artist") playlistid: 0)

And this will become:

((jsonrpc . 2.0)
 (method . Playlist.GetItems)
 (params
  (properties: . #(title album artist)) 
  (playlistid: . 0)) 
 (id . 1))

One more, just for fun.

After getting bored of listening to music, we get an urge to make a selection of available television shows. Here we don't use a vector, but we nest keyword arguments:

(xbmc "VideoLibrary.GetTVShows" filter: '((field: . "playcount")(operator: . "is")(value: . "0")))

After transformation:

((jsonrpc . 2.0)
 (method . VideoLibrary.GetTVShows)
 (params
  (filter: 
    (field: . playcount)
    (operator: . is)
    (value: . 0)))
 (id . 1))

Server

There is no server implementation for now.

License

 Copyright (c) 2013, Tim van der Linden
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
 
 Redistributions of source code must retain the above copyright
 notice, this list of conditions and the following disclaimer.
 
 Redistributions in binary form must reproduce the above copyright
 notice, this list of conditions and the following disclaimer in the
 documentation and/or other materials provided with the distribution.
 
 Neither the name of the author nor the names of its contributors may
 be used to endorse or promote products derived from this software
 without specific prior written permission.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH