succinct: Memory efficient JSON parser

[ bsd3, data, library, program ] [ Propose Tags ] [ Report a vulnerability ]

Memory efficient JSON parser. Please see README.md


[Skip to Readme]

library succinct:xml

Modules

  • Data
    • Succinct
      • Data.Succinct.Xml
        • Data.Succinct.Xml.Blank
        • Data.Succinct.Xml.CharLike
        • Data.Succinct.Xml.Decode
        • Data.Succinct.Xml.DecodeError
        • Data.Succinct.Xml.DecodeResult
        • Data.Succinct.Xml.Grammar
        • Data.Succinct.Xml.Index
        • Internal
          • Data.Succinct.Xml.Internal.BalancedParens
          • Data.Succinct.Xml.Internal.Blank
          • Data.Succinct.Xml.Internal.ByteString
          • Data.Succinct.Xml.Internal.List
          • Data.Succinct.Xml.Internal.Show
          • Data.Succinct.Xml.Internal.Tables
          • Data.Succinct.Xml.Internal.ToIbBp64
          • Data.Succinct.Xml.Internal.Words
        • Data.Succinct.Xml.Lens
        • Data.Succinct.Xml.RawDecode
        • Data.Succinct.Xml.RawValue
        • Data.Succinct.Xml.Succinct
          • Data.Succinct.Xml.Succinct.Cursor
            • Data.Succinct.Xml.Succinct.Cursor.BalancedParens
            • Data.Succinct.Xml.Succinct.Cursor.BlankedXml
            • Data.Succinct.Xml.Succinct.Cursor.Create
            • Data.Succinct.Xml.Succinct.Cursor.InterestBits
            • Data.Succinct.Xml.Succinct.Cursor.Internal
            • Data.Succinct.Xml.Succinct.Cursor.Load
            • Data.Succinct.Xml.Succinct.Cursor.MMap
            • Data.Succinct.Xml.Succinct.Cursor.Token
            • Data.Succinct.Xml.Succinct.Cursor.Types
          • Data.Succinct.Xml.Succinct.Index
        • Data.Succinct.Xml.Token
          • Data.Succinct.Xml.Token.Tokenize
          • Data.Succinct.Xml.Token.Types
        • Data.Succinct.Xml.Type
        • Data.Succinct.Xml.Value

library succinct:simd

Modules

  • Data
    • Succinct
      • Simd
        • Data.Succinct.Simd.Capabilities
        • Data.Succinct.Simd.ChunkString
        • Data.Succinct.Simd.Comparison
          • Data.Succinct.Simd.Comparison.Avx2
          • Data.Succinct.Simd.Comparison.Stock
        • Internal
          • Data.Succinct.Simd.Internal.Bits
          • Data.Succinct.Simd.Internal.Broadword
          • Data.Succinct.Simd.Internal.ChunkString
          • Data.Succinct.Simd.Internal.Foreign
          • Data.Succinct.Simd.Internal.Marshal
        • Data.Succinct.Simd.Logical
          • Data.Succinct.Simd.Logical.Avx2
          • Data.Succinct.Simd.Logical.Stock

library succinct:json-standard-cursor

Modules

  • Data
    • Succinct
      • Json
        • Standard
          • Data.Succinct.Json.Standard.Cursor
            • Data.Succinct.Json.Standard.Cursor.Fast
            • Data.Succinct.Json.Standard.Cursor.Generic
            • Data.Succinct.Json.Standard.Cursor.IbBp
            • Data.Succinct.Json.Standard.Cursor.Index
            • Internal
              • Data.Succinct.Json.Standard.Cursor.Internal.Blank
              • Data.Succinct.Json.Standard.Cursor.Internal.BlankedJson
              • Data.Succinct.Json.Standard.Cursor.Internal.MakeIndex
              • Data.Succinct.Json.Standard.Cursor.Internal.StateMachine
              • Data.Succinct.Json.Standard.Cursor.Internal.ToBalancedParens64
              • Data.Succinct.Json.Standard.Cursor.Internal.ToInterestBits64
              • Data.Succinct.Json.Standard.Cursor.Internal.Word8
            • Load
              • Data.Succinct.Json.Standard.Cursor.Load.Cursor
              • Data.Succinct.Json.Standard.Cursor.Load.Raw
            • Data.Succinct.Json.Standard.Cursor.SemiIndex
            • Data.Succinct.Json.Standard.Cursor.Slow
            • Data.Succinct.Json.Standard.Cursor.Specific
            • Data.Succinct.Json.Standard.Cursor.Type

library succinct:json-simple-cursor

Modules

  • Data
    • Succinct
      • Json
        • Simple
          • Data.Succinct.Json.Simple.Cursor
            • Data.Succinct.Json.Simple.Cursor.Fast
            • Internal
              • Data.Succinct.Json.Simple.Cursor.Internal.IbBp
              • Data.Succinct.Json.Simple.Cursor.Internal.ToIbBp
              • Data.Succinct.Json.Simple.Cursor.Internal.Word8
            • Data.Succinct.Json.Simple.Cursor.SemiIndex
            • Data.Succinct.Json.Simple.Cursor.Snippet

library succinct:json-simd

Modules

  • Data
    • Succinct
      • Json
        • Simd
          • Data.Succinct.Json.Simd.Capabilities
          • Index
            • Data.Succinct.Json.Simd.Index.Simple
            • Data.Succinct.Json.Simd.Index.Standard
          • Internal
            • Data.Succinct.Json.Simd.Internal.Foreign
            • Index
              • Data.Succinct.Json.Simd.Internal.Index.Simple
              • Data.Succinct.Json.Simd.Internal.Index.Standard
            • Data.Succinct.Json.Simd.Internal.List

library succinct:json-examples

library succinct:json

Modules

  • Data
    • Succinct
      • Json
        • Data.Succinct.Json.DecodeError
        • Data.Succinct.Json.FromValue
        • Internal
          • Data.Succinct.Json.Internal.CharLike
          • Data.Succinct.Json.Internal.Doc
          • Data.Succinct.Json.Internal.Index
          • Data.Succinct.Json.Internal.PartialIndex
          • Data.Succinct.Json.Internal.Slurp
          • Standard
            • Cursor
              • Data.Succinct.Json.Internal.Standard.Cursor.Token
            • Token
              • Data.Succinct.Json.Internal.Standard.Token.Tokenize
          • Data.Succinct.Json.Internal.Token
            • Data.Succinct.Json.Internal.Token.Types
          • Data.Succinct.Json.Internal.Value
          • Data.Succinct.Json.Internal.Word64
        • Data.Succinct.Json.LightJson
        • Data.Succinct.Json.PartialValue
        • Data.Succinct.Json.Query
        • Simple
          • Data.Succinct.Json.Simple.Value
        • Standard
          • Load
            • Data.Succinct.Json.Standard.Load.Partial
        • Data.Succinct.Json.Value

library succinct:dsv

Modules

  • Data
    • Succinct
      • Dsv
        • Internal
          • Data.Succinct.Dsv.Internal.Bits
          • Data.Succinct.Dsv.Internal.Broadword
          • Data.Succinct.Dsv.Internal.Char
            • Data.Succinct.Dsv.Internal.Char.Word64
          • Data.Succinct.Dsv.Internal.Vector
        • Lazy
          • Data.Succinct.Dsv.Lazy.Cursor
            • Data.Succinct.Dsv.Lazy.Cursor.Internal
            • Data.Succinct.Dsv.Lazy.Cursor.Lazy
            • Data.Succinct.Dsv.Lazy.Cursor.Strict
            • Data.Succinct.Dsv.Lazy.Cursor.Type
        • Strict
          • Data.Succinct.Dsv.Strict.Cursor
            • Data.Succinct.Dsv.Strict.Cursor.Internal
              • Data.Succinct.Dsv.Strict.Cursor.Internal.Reference
            • Data.Succinct.Dsv.Strict.Cursor.Type

library succinct:core-gen

Modules

  • Data
    • Succinct
      • BalancedParens
        • Data.Succinct.BalancedParens.Gen
        • Internal
          • Data.Succinct.BalancedParens.Internal.IO

library succinct:core

Modules

  • Data
    • Succinct
      • Data.Succinct.BalancedParens
        • Data.Succinct.BalancedParens.BalancedParens
        • Data.Succinct.BalancedParens.CloseAt
        • Data.Succinct.BalancedParens.Enclose
        • Data.Succinct.BalancedParens.FindClose
        • Data.Succinct.BalancedParens.FindCloseN
        • Data.Succinct.BalancedParens.FindOpen
        • Data.Succinct.BalancedParens.FindOpenN
        • Internal
          • Broadword
            • FindClose
              • Data.Succinct.BalancedParens.Internal.Broadword.FindClose.Vector16
              • Data.Succinct.BalancedParens.Internal.Broadword.FindClose.Vector32
              • Data.Succinct.BalancedParens.Internal.Broadword.FindClose.Vector64
              • Data.Succinct.BalancedParens.Internal.Broadword.FindClose.Vector8
              • Data.Succinct.BalancedParens.Internal.Broadword.FindClose.Word16
              • Data.Succinct.BalancedParens.Internal.Broadword.FindClose.Word32
              • Data.Succinct.BalancedParens.Internal.Broadword.FindClose.Word64
              • Data.Succinct.BalancedParens.Internal.Broadword.FindClose.Word8
            • FindUnmatchedCloseFar
              • Data.Succinct.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Vector16
              • Data.Succinct.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Vector32
              • Data.Succinct.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Vector64
              • Data.Succinct.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Vector8
              • Data.Succinct.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Word16
              • Data.Succinct.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Word32
              • Data.Succinct.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Word64
              • Data.Succinct.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Word8
            • Data.Succinct.BalancedParens.Internal.Broadword.Word64
          • Data.Succinct.BalancedParens.Internal.List
          • Data.Succinct.BalancedParens.Internal.Show
          • Slow
            • FindCloseC
              • Data.Succinct.BalancedParens.Internal.Slow.FindCloseC.Generic
            • FindCloseN
              • Data.Succinct.BalancedParens.Internal.Slow.FindCloseN.Generic
            • FindUnmatchedCloseFar
              • Data.Succinct.BalancedParens.Internal.Slow.FindUnmatchedCloseFar.Vector16
              • Data.Succinct.BalancedParens.Internal.Slow.FindUnmatchedCloseFar.Vector32
              • Data.Succinct.BalancedParens.Internal.Slow.FindUnmatchedCloseFar.Vector64
              • Data.Succinct.BalancedParens.Internal.Slow.FindUnmatchedCloseFar.Vector8
              • Data.Succinct.BalancedParens.Internal.Slow.FindUnmatchedCloseFar.Word16
              • Data.Succinct.BalancedParens.Internal.Slow.FindUnmatchedCloseFar.Word32
              • Data.Succinct.BalancedParens.Internal.Slow.FindUnmatchedCloseFar.Word64
              • Data.Succinct.BalancedParens.Internal.Slow.FindUnmatchedCloseFar.Word8
          • Data.Succinct.BalancedParens.Internal.Trace
          • Vector
            • Data.Succinct.BalancedParens.Internal.Vector.Storable
          • Data.Succinct.BalancedParens.Internal.Word
          • Data.Succinct.BalancedParens.Internal.Word16
          • Data.Succinct.BalancedParens.Internal.Word32
          • Data.Succinct.BalancedParens.Internal.Word64
          • Data.Succinct.BalancedParens.Internal.Word8
        • Data.Succinct.BalancedParens.NewCloseAt
        • Data.Succinct.BalancedParens.NewOpenAt
        • Data.Succinct.BalancedParens.OpenAt
        • Data.Succinct.BalancedParens.RangeMin
        • Data.Succinct.BalancedParens.RangeMin2
        • Data.Succinct.BalancedParens.Simple
      • Data.Succinct.Excess
        • Data.Succinct.Excess.Excess0
        • Data.Succinct.Excess.Excess1
        • Internal
          • Data.Succinct.Excess.Internal.Branchless
          • Partial
            • Data.Succinct.Excess.Internal.Partial.Table
          • Data.Succinct.Excess.Internal.Table
          • Data.Succinct.Excess.Internal.Triplet8
        • Data.Succinct.Excess.MinExcess
        • Data.Succinct.Excess.MinExcess0
        • Data.Succinct.Excess.MinExcess1
        • Data.Succinct.Excess.MinMaxExcess0
        • Data.Succinct.Excess.MinMaxExcess1
        • Data.Succinct.Excess.PartialMinExcess0
        • Data.Succinct.Excess.PartialMinExcess1
        • Data.Succinct.Excess.PartialMinMaxExcess0
        • Data.Succinct.Excess.PartialMinMaxExcess1
        • Data.Succinct.Excess.Triplet
      • Data.Succinct.MQuery
        • Data.Succinct.MQuery.AtLeastSize
        • Data.Succinct.MQuery.Entry
        • Data.Succinct.MQuery.Micro
        • Data.Succinct.MQuery.Mini
        • Data.Succinct.MQuery.Row
        • Data.Succinct.MQuery.Shows
        • Data.Succinct.MQuery.ToBool
      • Data.Succinct.Parser
      • RankSelect
        • Data.Succinct.RankSelect.Base
          • Data.Succinct.RankSelect.Base.Internal
          • Data.Succinct.RankSelect.Base.Rank
          • Data.Succinct.RankSelect.Base.Rank0
          • Data.Succinct.RankSelect.Base.Rank1
          • Data.Succinct.RankSelect.Base.Select
          • Data.Succinct.RankSelect.Base.Select0
          • Data.Succinct.RankSelect.Base.Select1
        • Data.Succinct.RankSelect.CsPoppy
          • Internal
            • Data.Succinct.RankSelect.CsPoppy.Internal.Alpha0
            • Data.Succinct.RankSelect.CsPoppy.Internal.Alpha1
            • Data.Succinct.RankSelect.CsPoppy.Internal.CsInterleaved
            • Data.Succinct.RankSelect.CsPoppy.Internal.Lookup
            • Data.Succinct.RankSelect.CsPoppy.Internal.Nice
            • Data.Succinct.RankSelect.CsPoppy.Internal.Reference
            • Data.Succinct.RankSelect.CsPoppy.Internal.Vector
        • Data.Succinct.RankSelect.CsPoppy0
        • Data.Succinct.RankSelect.CsPoppy1
        • Internal
          • Data.Succinct.RankSelect.Internal.List
          • Data.Succinct.RankSelect.Internal.Word
        • Data.Succinct.RankSelect.Poppy512
      • String
        • Data.Succinct.String.Parse

Flags

Automatic Flags
NameDescriptionDefault
bmi2

Enable bmi2 instruction set

Disabled
sse42

Enable sse4.2 instruction set

Disabled

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.0.0.1
Dependencies aeson (>=2.0 && <2.3), appar (>=0.1.8 && <0.2), array (>=0.5 && <0.6), attoparsec (>=0.13 && <0.15), attoparsec-aeson (>=2 && <3), base (>=4.11 && <5), bits-extra (>=0.0.1.3 && <0.1), bytestring (>=0.10.6 && <0.13), cereal (>=0.5.8.1 && <0.6), containers (>=0.5 && <0.8), deepseq (>=1.4 && <1.6), directory (>=1.3 && <1.4), dlist (>=0.8 && <1.1), generic-lens (>=1.2.0.1 && <2.3), ghc-prim (>=0.5 && <0.14), hedgehog (>=0.6 && <1.6), hspec (>=2.4 && <3), hw-bits (>=0.7.0.5 && <0.8), hw-int (>=0.0.2 && <0.0.3), hw-ip (>=2.3.4.2 && <2.5), hw-prim (>=0.6.2.32 && <0.7), lens (>=4 && <6), mmap (>=0.5 && <0.6), mtl (>=2.2 && <3), optparse-applicative (>=0.14 && <0.19), prettyprinter (>=1 && <2), resourcet (>=1.1 && <1.4), safe (>=0.2 && <0.4), scientific (>=0.3.6.2 && <0.4), succinct, text (>=1.2 && <3), transformers (>=0.4 && <0.7), unordered-containers (>=0.2 && <0.3), vector (>=0.12 && <0.14), word8 (>=0.1 && <0.2) [details]
Tested with ghc ==9.10.1, ghc ==9.8.4, ghc ==9.6.6, ghc ==9.4.8
License BSD-3-Clause
Copyright 2016-2024 John Ky
Author John Ky
Maintainer newhoggy@gmail.com
Category Data
Home page http://github.com/haskell-works/succinct#readme
Bug tracker https://github.com/haskell-works/succinct/issues
Source repo head: git clone https://github.com/haskell-works/succinct
Uploaded by haskellworks at 2025-03-08T02:26:04Z
Distributions
Executables succinct-xml, succinct-json-simple-cursor, succinct-json-simd, succinct-json, succinct-dsv, succinct
Downloads 5 total (5 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs not available [build log]
All reported builds failed as of 2025-03-08 [all 2 reports]

Readme for succinct-0.0.0.1

[back to package description]

succinct

master

succinct is a succinct JSON parsing library.

It uses succinct data-structures to allow traversal of large JSON strings with minimal memory overhead.

For an example, see app/Main.hs

Prerequisites

  • cabal version 2.2 or later
  • Depending on your use case you may need additional package dependencies. These can be found in the library dependencies of the examples library component in the cabal file.

Memory benchmark

If you need a repl to run any of the Haskell examples in this README, please run the command:

cabal v2-repl lib:examples

For rexamples these examples are also found in Haskell modules under the examples directory.

Parsing large Json files in Scala with Argonaut

      S0U       EU           OU       MU     CCSU CMD
--------- --------- ----------- -------- -------- ---------------------------------------------------------------
      0.0  80,526.3    76,163.6 72,338.6 13,058.6 sbt console
      0.0 536,660.4    76,163.6 72,338.6 13,058.6 import java.io._, argonaut._, Argonaut._
      0.0 552,389.1    76,163.6 72,338.6 13,058.6 val file = new File("/Users/jky/Downloads/78mbs.json"
      0.0 634,066.5    76,163.6 72,338.6 13,058.6 val array = new Array[Byte](file.length.asInstanceOf[Int])
      0.0 644,552.3    76,163.6 72,338.6 13,058.6 val is = new FileInputStream("/Users/jky/Downloads/78mbs.json")
      0.0 655,038.1    76,163.6 72,338.6 13,058.6 is.read(array)
294,976.0 160,159.7 1,100,365.0 79,310.8 13,748.1 val json = new String(array)
285,182.9 146,392.6 1,956,264.5 82,679.8 14,099.6 val data = Parse.parse(json)
                    ***********

Parsing large Json files in Haskell with Aeson

-- CMD                                                     -- Mem (MB)
---------------------------------------------------------- -- --------
import Control.DeepSeq                                     --      345
import Data.Aeson                                          --      371
import qualified Data.ByteString.Lazy as LBS               --      376
!bs <- LBS.readFile "corpus/bench/hospitalisation.json"    --      380
let !y = decode bs :: Maybe Value                          --      928

Parsing large Json files in Haskell with succinct

-- CMD                                                            -- Mem (MB)
----------------------------------------------------------------- -- --------
import qualified Data.Succinct.ByteString                as BS    --      351
import qualified Data.Succinct.Json.Standard.Cursor.Fast as JCF   --      353

!jsonBs <- BS.mmap "corpus/bench/hospitalisation.json"            --      355
let !ibip = JCF.simdToIbBp jsonBs                                 --      358
let !c    = JCF.fromBsIbBp jsonBs ibip                            --      495

Examples

import Control.Monad

import qualified Data.ByteString                             as BS
import qualified Data.Succinct.Json.Standard.Cursor.Fast as JCF
import qualified Data.Succinct.TreeCursor                as TC

let fc = TC.firstChild
let ns = TC.nextSibling
let pn = TC.parent
let ss = TC.subtreeSize
let jsonBs  = "[null, {\"field\": 1}]" :: BS.ByteString
let ibip    = JCF.simdToIbBp jsonBs
let cursor  = JCF.fromBsIbBp jsonBs ibip
fc cursor
(fc >=> ns) cursor

Querying example

import Control.Monad
import Data.Function
import Data.List
import Data.Succinct.Json.PartialValue
import Data.Succinct.Json.Standard.Cursor.Load.Cursor
import Data.Succinct.Json.Standard.Load.Partial
import Data.Succinct.MQuery
import Data.Succinct.MQuery.Micro

import qualified Data.DList as DL

!cursor <- loadPartial "corpus/bench/78mb.json"
!cursor <- loadCursorWithIndex "corpus/bench/78mb.json"
!cursor <- loadCursor "corpus/bench/78mb.json"
!cursor <- loadCursorWithCsPoppyIndex "corpus/bench/78mb.json"
let !json = jsonPartialJsonValueAt cursor
let q = MQuery (DL.singleton json)

putPretty $ q >>= item & limit 10
putPretty $ q >>= item & page 10 1
putPretty $ q >>= item >>= hasKV "founded_year" (JsonPartialNumber 2005) & limit 10
putPretty $ q >>= item >>= entry
putPretty $ q >>= item >>= entry >>= named "name" & limit 10
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> entry >=> named "price_currency_code")
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> entry >=> named "price_currency_code") & onList (uniq . sort)
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> entry >=> named "price_currency_code" >=> asString >=> valueOf "USD") & limit 10
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> having (entry >=> named "price_currency_code" >=> asString >=> valueOf "USD") >=> entry >=> named "price_amount") & limit 10
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> having (entry >=> named "price_currency_code" >=> asString >=> valueOf "USD") >=> entry >=> named "price_amount" >=> castAsInteger ) & limit 10
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> having (entry >=> named "price_currency_code" >=> asString >=> valueOf "USD") >=> entry >=> named "price_amount" >=> castAsInteger ) & aggregate sum

putPretty $ q >>= item & limit 10
putPretty $ q >>= item & page 10 1
putPretty $ q >>= item >>= entry
putPretty $ q >>= item >>= entry >>= named "name" & limit 10
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> entry >=> named "price_currency_code" >=> asString)
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> entry >=> named "price_currency_code" >=> asString) & onList (uniq . sort)
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> entry >=> named "price_currency_code" >=> asString >=> valueOf "USD") & limit 10
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> having (entry >=> named "price_currency_code" >=> asString >=> valueOf "USD") >=> entry >=> named "price_amount") & limit 10
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> having (entry >=> named "price_currency_code" >=> asString >=> valueOf "USD") >=> entry >=> named "price_amount" >=> castAsInteger ) & limit 10
putPretty $ q >>= (item >=> entry >=> named "acquisition" >=> having (entry >=> named "price_currency_code" >=> asString >=> valueOf "USD") >=> entry >=> named "price_amount" >=> castAsInteger ) & aggregate sum

References

Special mentions