On Thursday, 24 July 2014 at 15:54:21 UTC, 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 operator in d returns a pointer to the element found or null. This might be a little confusing at first* but it makes sense for efficiency reasons. There is often a lot overlap between the work needed to test for presence and the work needed to fetch an element.

For types where fetching elements is a significant extra cost you can always define a `bool contains(K key) { /* ... */ }` so a user can avoid this cost when appropriate.


*although to be honest it's just a different reading:
`b in c` can be read as "the b in c" or "is b in c?"

Reply via email to