D JSON (WAT?!)

Justin Whear via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jul 24 08:59:55 PDT 2014


On Thu, 24 Jul 2014 15:54:20 +0000, Pavel wrote:

> On Thursday, 24 July 2014 at 15:48:32 UTC, Edwin van Leeuwen wrote:
>> On Thursday, 24 July 2014 at 15:42:58 UTC, Pavel wrote:
>>> On Thursday, 24 July 2014 at 15:38:06 UTC, John Colvin wrote:
>>>> On Thursday, 24 July 2014 at 15:32:29 UTC, John Colvin wrote:
>>>>> On Thursday, 24 July 2014 at 15:15:37 UTC, Pavel wrote:
>>>>>> Ok, let me start with the sample code:
>>>>>>
>>>>>> import std.stdio;
>>>>>> import std.json;
>>>>>>
>>>>>> void main() {
>>>>>> scope(failure) writeln("FaILED!!");
>>>>>> string jsonStr = `{ "name": "1", "type": "r" }`;
>>>>>> auto parsed = parseJSON(jsonStr);
>>>>>> string s = parsed["fail"].str;
>>>>>> writeln(s == "");
>>>>>> writeln(s is null);
>>>>>> writeln(s);
>>>>>> }
>>>>>>
>>>>>> Running "rdmd app.d" doesn't produce any output.
>>>>>> Can anyone explain such a behavior???
>>>>>>
>>>>>>
>>>>>> PS: Running dmd v2.065 on Linux x64.
>>>>>
>>>>> It's a bug in std.json (you should get a segfault, not no output at
>>>>> all)
>>>>>
>>>>> It is fixed now and I'm pretty sure it will be in 2.066
>>>>>
>>>>> std.json has been improved a lot, but I would still recommend using
>>>>> http://vibed.org/api/vibe.data.json/ instead
>>>>
>>>> perhaps "bug" is too strong a word, but it was a deficiency that is
>>>> now corrected. You will get an exception thrown now and everything
>>>> should work how you expect.
>>>
>>> Maybe. But still it's not the way I expect, any time you check for
>>> non-existing property you must consider exception, which is very heavy
>>> to deal with in such a situation. I'd rather expect to get null,
>>> whenever I try to fetch non-existing property, and not an exception.
>>
>> You can turn your json object into an AA object and then use in to
>> check for existence (I know it is not very intuitive):
>>
>> JSONValue[string] jsonAA = parsed.object;
>> if ( "fail" in jsonAA )
>>   s = jsonAA["fail"].str;
>>
>>
>>
>>
>>> That's purely my point, and I don't claim to be right in this way.
>>> It's up to Phobos maintainers to decide how to reprent JSON parsing
>>> results.
> 
> Guess what, here's a new snippet:
> 
> import std.stdio;
> import std.json;
> 
> void main() {
>    scope(failure) writeln("FaILED!!");
>    string jsonStr = `{ "name": "1", "type": "r" }`;
>    auto parsed = parseJSON(jsonStr).object; writeln("fail" in parsed);
> }
> 
> Output is:
> null
> 
> WAT?!
> 
> Ofcourse, writing like:
> 
> writeln(cast(bool)("fail" in parsed));
> 
> Produces "false"... but why on earth boolean expression would output
> null?
> 
> PS: Sorry, for such an emotional boom, I'm so frustrated right now.

The `in` expression produces a pointer to the value in the container, not 
a bool.  If the key is not present in the container, it returns the null 
pointer.  So this test is working precisely as expected.  Here are some 
common idioms for working with `in` and associative arrays:

// if with declaration
if (auto vptr = "fail" in parsed.object)
    writeln("here's the value: ", *vptr);
else
    writeln("fail is not in the JSON");

// coerce to bool
writeln(!!("fail" in parsed.object));

// get the value or a default value
writeln(parsed.object.get("fail", someDefaultJson));


More information about the Digitalmars-d-learn mailing list