GitHub - repeatedly/yajl-d: YAJL binding for D (original) (raw)

YAJL binding for D

yajl-d is a YAJL binding for D.

yajl-d is based on YAJL and work on 2.1.0 or later.

Install

Add yajl to dependencies of package.json.

"dependencies": { "yajl": ">=0.2.0" }

Run example

Need to link yajl library

dmd -Isrc src/**/*.d -L-lyajl -run example/encode_bench.d

Usage

Encode

import yajl;

struct Hoge { ulong id; string word; bool yes; }

// {"id":100,"word":"hey!","yes":true} string json = encode(Hoge(100, "hey!", true));

Decode

import yajl;

Hoge hoge = decode!Hoge({"id":100,"word":"hey!","yes":true});

Use decode and decodedValue methods.

import yajl.decoder;

Decoder decoder; if (decoder.decode({"id":100,"word":"hey!","yes":true}) { Hoge hoge = decoder.decodedValue!Hoge; // ... }

Decoder#decode is a straming decoder, so you can pass the insufficient json to this method. If Decoder#decode can't parse completely, Decoder#decode returns false.

Encoder.Option and Decoder.Option

encode and decode can take each Option argument. If you want to know more details, see unittest of yajl.encoder / yajl.decoder.

Set callback to detect missing field

You can set own callback to Decoder.Option.missingHandler. Here is an example:

import yajl; import std.stdio;

struct Test { string name; int age; }

void main() { auto test = Test("Bob", 20); auto encoded = { "name": "Bob", "age": 20}; auto missing = { "name": "Bob"};

Decoder.Option opt; opt.missingHandler = (string field) { writeln(field); }; writeln(decode!Test(encoded, opt)); writeln(decode!Test(missing, opt)); // Callback called with missing field }

Using a D keyword in JSON field names

Since a field name cannot be a D keyword, for example body or out, the variable and JSON field must have separate names. For this, use the @JSONName("name") attribute:

import yajl;

struct Hoge { ulong id; @JSONName("body") string _body; bool yes; }

// {"id":100,"body":"hey!","yes":true} string json = encode(Hoge(100, "hey!", true));

Perfomance

D: dmd 2.066.0
yajl: 2.1.0
OS: Mac OS X ver 10.9
CPU: 2.6 GHz Intel Core i7

encode(QPS) multi encode(QPS) decode(QPS) multi decode(QPS)
std.json 262272 Not supported 287072 Not supported
yajl-d 700098 948965 514065 775532

Benchmark code can be found in the example directory.

TODO

Author Masahiro Nakagawa
Copyright Copyright (c) 2013- Masahiro Nakagawa
License Boost Software License, Version 1.0