Thank you Rony. 👏 I have had to use terrible kludges to get over the otherwise remarkably usable JSON class's habit of turning JSON booleans into ooRexx booleans. This will be a great boon.
+1 to adding this to the language proper. Jon On Thu, 2 Feb 2023 at 12:37, Rony G. Flatscher <rony.flatsc...@wu.ac.at> wrote: > "json.cls" as distributed with ooRexx 5.0.0 has one (actually two) > limitation which can be regarded to be a bug: > > - It cannot handle JSON booleans properly: when reading a JSON file > with boolean values and creating a JSON file from ooRexx the boolean values > will not show up, rather their ooRexx numeric representations of "0" and > "1". > > In the past I came up with a solution for this problem which was not > "liked" and was 30% slower than json.cls (sounds dramatic, but in today's > world with such power horses in the hands of end-users may be negligeable, > but still, one being made aware of this made it less attractive). > > As the above limitation is really a problem if one wants to use ooRexx > json.cls and exchange proper JSON with other systems, e.g. via curl, I came > up with a version (starting out with the current json.cls) that does the > following in addition: > > - It adds support for JSON true and false: just send .json~true or > .json~false. The resulting JsonBoolean objects behave like ooRexx .true and > .false (both strings with the numeric values "0" and "1") and can be used > interchangeably > > - when reading a JSON file, JSON booleans will be represented with the > appropriate .json~true or .json~false values > > - when writing a JSON file, any JSON boolean value will be properly > encoded with "false" and "true" > > - It adds generic support for MapCollection and OrderedCollection > instead of restricting support to Directory and Array, > > - It uses StringTable instead of Directory for reading in JSON data, > > - Although JSON is a string encoding, which could be read by humans, > there are two observable properties that do not make it human-friendly: > > - by default the encoding is "minimized" such that no ignorable > whitespace (usually used for making JSON better legible e.g. cf. > Wikipedia's JSON [1] sample) is contained, > > - there is no sorted order of name/value pairs (per specification > no order is implied, yet for humans having a sorted order in the JSON > encoded data makes it possible to quickly check whether certain > name/values > pairs exist or not without affecting any JSON importer) > > the replacement version will create by default minimized JSON encodings, > however it will sort name/value pairs by name to ease reading by humans > > > - as this is Rexx/ooRexx it is made possible to create a "legible", a > "human-oriented" JSON encoding in two ways: when creating a JSON instance > or when sending the toJson message one can supply .true which causes the > produced JSON encoding to be formatted with ignorable whitespace such that > it will be easy to see the structure and spot name/value pairs therein; > yet, the produced JSON is still JSON and can be processed without problems, > > - two new convenience class methods for reading from and writing to > files are defined: fromJsonFile(fileName) and toJsonFile(fileName, > ooRexxObject [, legible=.true]) > > Here the JSON sample given at [1]: > > { "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 27, > "address": { "streetAddress": "21 2nd Street", "city": "New York", > "state": "NY", "postalCode": "10021-3100" }, "phoneNumbers": [ { > "type": "home", "number": "212 555-1234" }, { "type": > "office", "number": "646 555-4567" } ], "children": [ > "Catherine", "Thomas", "Trevor" ], "spouse": null} > > Here the minimized rendering with the replacement version of json.cls: > > {"address":{"city":"New > York","postalCode":"10021-3100","state":"NY","streetAddress":"21 2nd > Street"},"age":27,"children":["Catherine","Thomas","Trevor"],"firstName":"John","isAlive":true,"lastName":"Smith","phoneNumbers":[{"number":"212 > 555-1234","type":"home"},{"number":"646 > 555-4567","type":"office"}],"spouse":null} > > Here the legible rendering with the replacement version of json.cls: > > { > "address": { > "city": "New York", > "postalCode": "10021-3100", > "state": "NY", > "streetAddress": "21 2nd Street" > }, > "age": 27, > "children": [ > "Catherine", > "Thomas", > "Trevor" > ], > "firstName": "John", > "isAlive": true, > "lastName": "Smith", > "phoneNumbers": [ > { > "number": "212 555-1234", > "type": "home" > }, > { > "number": "646 555-4567", > "type": "office" > } > ], > "spouse": null > } > > --- > > Here an ooRexx program that creates a structure which will get encoded as > minimized and legible JSON: > > -- create a Rexx structure > d=.directory~new > d["firstName"] = "Mary" > d["lastName" ] = "Doe" > d["children" ] = .list~of("Maribel", "John", "Annabel") > d["married" ] = .json~false > d["born" ] = "2001-02-02" > d["yearBorn" ] = 2001 > d["bestMan" ] = .nil > > j = .json~new > say j~toJson(d) -- write minimized JSON > say "---" > say j~toJson(d,.true) -- write legible JSON > > ::requires "json.cls" -- get access to the JSON class > > Here the output of the above program: > > {"bestMan":null,"born":"2001-02-02","children":["Maribel","John","Annabel"],"firstName":"Mary","lastName":"Doe","married":false,"yearBorn":2001} > --- > { > "bestMan": null, > "born": "2001-02-02", > "children": [ > "Maribel", > "John", > "Annabel" > ], > "firstName": "Mary", > "lastName": "Doe", > "married": false, > "yearBorn": 2001 > } > > --- > > The replacement json.cls and the adjusted official json.tesgroup can be > found in my sandbox at > <https://sourceforge.net/p/oorexx/code-0/HEAD/tree/sandbox/rony/json/> > <https://sourceforge.net/p/oorexx/code-0/HEAD/tree/sandbox/rony/json/>. > > Performance when reading and writing is comparable to 5.0's json.cls. > ---rony > > [1] Wikipedia JSON: <https://en.wikipedia.org/wiki/JSON> > <https://en.wikipedia.org/wiki/JSON> > > > _______________________________________________ > Oorexx-devel mailing list > Oorexx-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/oorexx-devel >
_______________________________________________ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel