std.json API improvement - Request for code review

Robert Jacques sandford at jhu.edu
Mon Sep 13 20:03:03 PDT 2010


On Mon, 13 Sep 2010 18:59:57 -0400, sybrandy <sybrandy at gmail.com> wrote:

> On 09/12/2010 10:53 PM, Brian Schott wrote:
>> Everything is a JSONValue. JSONValue has a union inside it that actually
>> holds the data. I just wrote a short program that reads your example
>> file. (This could be a bit more efficient if I stored obj2, but I think
>> it's enough to communicate the idea.)
>>
>> import std.stdio;
>> import std.json;
>> import std.file;
>>
>> void main(string[] args)
>> {
>> 	auto jsonString = readText("../ml.json");
>> 	JSONValue json = parseJSON(jsonString);
>> 	writeln(json["obj1"]["obj2"]["val1"].integer);
>> 	writeln(json["obj1"]["obj2"]["val2"].str);
>> 	foreach(value; json["obj1"]["val3"].array)
>> 		writeln(value.integer);
>> }
>>
>> Output:
>>
>> 1
>> a string
>> 1
>> 2
>> 3
>> 4
>>
>> Your question did remind me to document the union members so that the
>> HTML documentation will show how to access the actual data. I've
>> uploaded the new version of the file. The link is the same.
>
> Cool.  It looks very simple and easy...just the way I like it.  What you  
> have is actually quite nice as I can navigate down to a low-level  
> element without having to store 200 different intermediate values.  
> Probably not very common, but a nicety for when it's needed.
>
> Thanks!
>
> Casey
>

Unfortunately, the above code is horribly broken. Here's how to read a  
number correctly:

real x;
if(json["vector"]["x"].type == JSON_TYPE.INTEGER) {
     x = json["vector"]["x"].integer;
} else if(json["vector"]["x"].type == JSON_TYPE.FLOAT) {
     x = json["vector"]["x"].floating;
} else {
     enforceEx!(JSONException)(false);
}

You'll notice that before any access you must check to ensure the JSON  
type is what you think it should be. As noted above, JSON does not  
differentiate between integers and reals, so you have to test both on  
access.


More information about the Digitalmars-d mailing list