123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778(**************************************************************************)(* *)(* Copyright 2012-2019 OCamlPro *)(* *)(* All rights reserved. This file is distributed under the terms of the *)(* GNU Lesser General Public License version 2.1, with the special *)(* exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)typet=[`Null|`Boolofbool|`Floatoffloat|`Stringofstring|`Aoftlist|`Oof(string*t)list]type'aencoder='a->ttype'adecoder=t->'aoption(* adapted snippets from jsonm maintainers
https://erratique.ch/repos/jsonm/tree/test/jtree.ml
*)letof_string?encodingstr=letdecd=matchJsonm.decodedwith|`Lexemel->l|`Error_->raiseExit|`End|`Await->assertfalseinletrecvaluevkd=matchvwith|`Os->obj[]kd|`As->arr[]kd|`Null|`Bool_|`String_|`Float_asv->kvd|_->assertfalseandarrvskd=matchdecdwith|`Ae->k(`A(List.revvs))d|v->valuev(funv->arr(v::vs)k)dandobjmskd=matchdecdwith|`Oe->k(`O(List.revms))d|`Namen->value(decd)(funv->obj((n,v)::ms)k)d|_->assertfalseinletd=Jsonm.decoder?encoding(`Stringstr)intrySome(value(decd)(funv_->v)d)withExit->Noneletto_buffer~minifybuffjson=letencel=ignore(Jsonm.encodee(`Lexemel))inletrecvaluevke=matchvwith|`Avs->arrvske|`Oms->objmske|`Null|`Bool_|`Float_|`String_asv->encev;keandarrvske=ence`As;arr_vsvskeandarr_vsvske=matchvswith|v::vs'->valuev(arr_vsvs'k)e|[]->ence`Ae;keandobjmske=ence`Os;obj_msmskeandobj_msmske=matchmswith|(n,v)::ms->ence(`Namen);valuev(obj_msmsk)e|[]->ence`Oe;keinlete=Jsonm.encoder~minify(`Bufferbuff)inletfinishe=ignore(Jsonm.encodee`End)invaluejsonfinisheletto_string?(minify=false)j=letb=Buffer.create1024into_buffer~minifybj;Buffer.contentsb(* General json output *)letjson_buffer=ref[]letappendkeyjson=json_buffer:=(key,json)::!json_bufferletflushoc=letb=Buffer.create1024inletjson=(`O(List.rev!json_buffer))inletjson=to_buffer~minify:truebjson;Buffer.contentsbinoutput_stringocjson;flushoc