Thread overview
Problem when calling toJSON()
Jan 31, 2016
Alex Herrmann
Feb 01, 2016
Ali Çehreli
Feb 01, 2016
Alex Herrmann
Feb 01, 2016
anonymous
January 31, 2016
Hello all,
  I'm having a *really* weird problem (at least I think so). I have a function on a struct that converts it into JSON. Everything works, no big deal. But when I try to turn that JSONValue into a string, I get a UTF-8 Error. What makes it even weirder, is that if I call toJSON before I return it in my conversion function everything works.

Full GIST example is here: https://gist.github.com/alexmherrmann/f0441404497d5be4ba58

Here is my toJson function:

JSONValue fdToJson() {
    JSONValue[string] obj;

    auto outtime = JSONValue(modtime.date.toISOExtString());
    obj["modtime"] = outtime;

    auto fname = JSONValue(filename);
    obj["filename"] = fname;

    auto outmd5 = JSONValue(cast(string) toHexString(md5_hash));
    obj["md5"] = outmd5;

    auto jav = JSONValue(obj);

    err("tojson created:\n%s".format(jav.toPrettyString()));
    return jav;
  }

This works perfectly, the string is well formatted and nothing is wrong:

tojson created:
{
    "filename": "test.txt",
    "md5": "CF5B097A991BEEA7D5E2D1818DF1AADF",
    "modtime": "2016-01-31"
}

however, when I do this:

auto a = fd.fdToJson();
writeln(a.toPrettyString());

I get this error: core.exception.UnicodeException@src/rt/util/utf.d(290): invalid UTF-8 sequence

Note that I am running 2.070.0.

Is this a bug or am I doing something wrong?
January 31, 2016
On 01/31/2016 02:52 PM, Alex Herrmann wrote:

> Note that I am running 2.070.0.

Then it's probably a bug related to this change:

  http://dlang.org/changelog/2.070.0.html#json-encode-control-characters

Ali

February 01, 2016
On Monday, 1 February 2016 at 00:24:06 UTC, Ali Çehreli wrote:
> On 01/31/2016 02:52 PM, Alex Herrmann wrote:
>
> > Note that I am running 2.070.0.
>
> Then it's probably a bug related to this change:
>
>   http://dlang.org/changelog/2.070.0.html#json-encode-control-characters
>
> Ali

This problem is solved! Sorry for not updating the question.

It was actually a problem with me not iduping it, and the memory being reclaimed or something similar. I did also change to stdx.data.json (std_data_json on dub).
February 01, 2016
On 01.02.2016 01:29, Alex Herrmann wrote:
> This problem is solved! Sorry for not updating the question.
>
> It was actually a problem with me not iduping it, and the memory being
> reclaimed or something similar. I did also change to stdx.data.json
> (std_data_json on dub).

You don't seem to be clear on what exactly went wrong. So here's an explanation:

On 31.01.2016 23:52, Alex Herrmann wrote:
>      auto outmd5 = JSONValue(cast(string) toHexString(md5_hash));

That cast is bad. You're casting a fixed-size char array to string, effectively slicing it. The data will get corrupted when the fixed-size array goes out of scope. Which happens immediately here, as you don't store the result of the toHexString call anywhere.

As you mentioned, .idup instead of cast is the proper way to do this. std.conv.to!string is another option.

Generally, casts should be avoided. It's easy to mess up with them in subtle ways.