highjson: Very fast JSON serialisation and parsing library

[ json, library, mit, text, web ] [ Propose Tags ]

Low boilerplate, easy to use and very fast JSON serialisation and parsing


[Skip to Readme]
Versions [faq] 0.1.0.0, 0.2.0.0, 0.2.0.1, 0.2.0.2, 0.3.0.0, 0.4.0.0 (info)
Dependencies attoparsec (>=0.13.0.0), base (>=4.7 && <5), buffer-builder (>=0.2.4), bytestring (>=0.10.4.0), containers, hashable (>=1.1.2), hvect (>=0.2), scientific (>=0.3.3), text (>=1.1.1), unordered-containers (>=0.2.5), vector (>=0.7.1) [details]
License MIT
Copyright (c) 2015 Alexander Thiemann
Author Alexander Thiemann <mail@athiemann.net>
Maintainer Alexander Thiemann <mail@athiemann.net>
Category Text, Web, JSON
Home page https://github.com/agrafix/highjson
Bug tracker https://github.com/agrafix/highjson/issues
Source repo head: git clone git://github.com/agrafix/highjson.git
Uploaded by AlexanderThiemann at Sun Jul 26 22:14:58 UTC 2015
Distributions NixOS:0.4.0.0
Downloads 3208 total (191 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2015-07-26 [all 1 reports]

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for highjson-0.2.0.1

[back to package description]

highjson

Build Status

Hackage Deps

Intro

Hackage: highjson

Low boilerplate, easy to use and very fast Haskell JSON serialisation and parsing. WARNING: Work in progress!

Usage

{-# LANGUAGE OverloadedStrings #-}
data SomeDummy
   = SomeDummy
   { sd_int :: Int
   , sd_bool :: Bool
   , sd_text :: T.Text
   , sd_either :: Either Bool T.Text
   , sd_maybe :: Maybe Int
   } deriving (Show, Eq)

someDummySpec =
    JsonSpec SomeDummy $
    "int" .= sd_int
    :+: "bool" .= sd_bool
    :+: "text" .= sd_text
    :+: "either" .= sd_either
    :+: "maybe" .=? sd_maybe
    :+: EmptySpec

instance ToJson SomeDummy where
    toJson = makeSerialiser someDummySpec

instance JsonReadable SomeDummy where
    readJson = makeParser someDummySpec

test =
    parseJsonBs "{\"int\": 34, \"text\": \"Teext\", \"bool\": true, \"either\": false}"
        == Right (SomeDummy 34 True "Teext" (Left False) Nothing)
 ```

For more usage examples check the tests.

## Install

* Using cabal: `cabal install highjson`
* From Source: `git clone https://github.com/agrafix/highjson.git && cd highjson && cabal install`

## Todo

* Implement proper string parsing (handle escape charaters)
* Write more tests
* Generate typescript interfaces from object specs
* ...

## Benchmarks

To run the benchmarks, use `cabal bench`. Current results on my MacBook Pro:

$ cabal bench Preprocessing library highjson-0.2.0.0... In-place registering highjson-0.2.0.0... Preprocessing benchmark 'highjson-benchmarks' for highjson-0.2.0.0... Running 1 benchmarks... Benchmark highjson-benchmarks: RUNNING... benchmarking twitter/aeson time 2.148 ms (2.102 ms .. 2.187 ms) 0.997 R² (0.995 R² .. 0.999 R²) mean 2.137 ms (2.112 ms .. 2.169 ms) std dev 99.12 μs (81.84 μs .. 120.1 μs) variance introduced by outliers: 31% (moderately inflated)

benchmarking twitter/highjson time 2.196 ms (2.162 ms .. 2.235 ms) 0.998 R² (0.996 R² .. 0.999 R²) mean 2.222 ms (2.195 ms .. 2.252 ms) std dev 94.52 μs (75.45 μs .. 125.1 μs) variance introduced by outliers: 28% (moderately inflated)


The benchmarks are derived from [aeson](https://github.com/bos/aeson)'s
twitter-json-parsing benchmarks and should probably more there when this library is in a
more complete state.