digitalmars.D.learn - Problem when calling toJSON()
- Alex Herrmann (38/38) Jan 31 2016 Hello all,
- =?UTF-8?Q?Ali_=c3=87ehreli?= (4/5) Jan 31 2016 Then it's probably a bug related to this change:
- Alex Herrmann (5/11) Jan 31 2016 This problem is solved! Sorry for not updating the question.
- anonymous (12/17) Jan 31 2016 You don't seem to be clear on what exactly went wrong. So here's an
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?
Jan 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
Jan 31 2016
On Monday, 1 February 2016 at 00:24:06 UTC, Ali Çehreli wrote:On 01/31/2016 02:52 PM, 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).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
Jan 31 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.
Jan 31 2016