Two problems with json and lcd

AlphaPurned Alpha at Beta.com
Thu Feb 20 00:33:48 UTC 2020


On Wednesday, 19 February 2020 at 08:47:04 UTC, Petar Kirov 
[ZombineDev] wrote:
> On Wednesday, 19 February 2020 at 08:14:34 UTC, AlphaPurned 
> wrote:
>>
>> The first is std.json. It is broke. Doesn't work with tuples. 
>> The change above fixes it by treating tuple as an array(same 
>> code). It works fine.
>
> Can you post a minimal, but complete program that shows the 
> problems with std.json regarding tuples?
>
> If you do we could open a pull request that fixes the problem 
> and also uses the code of your program as a unit test, to both 
> showcase the support for tuples and also prevent regressions in 
> the future.

It's in the code. Don't n eed a minimal example. If you want one 
just try to json a tuple.
...

         else static if (isArray!T || (T.stringof.length > 4 && 
T.stringof[0..5] == "Tuple"))
         {
             type_tag = JSONType.array;
             static if (is(ElementEncodingType!T : JSONValue))
             {
                 JSONValue[] t = arg;
                 () @trusted { store.array = t; }();
             }
             else
             {
                 JSONValue[] new_arg = new JSONValue[arg.length];
                 foreach (i, e; arg)
                     new_arg[i] = JSONValue(e);
                 () @trusted { store.array = new_arg; }();
             }
         }
         else static if (is(T : JSONValue))
         {
             type_tag = arg.type;
             store = arg.store;
         }
         else
         {
             static assert(false, text(`unable to convert type "`, 
T.stringof, `" to json`));
         }

That is the fix.

The code does not check for tuples. I simply modified the check 
on arrays to check for tuples since the static code is exactly 
the same for arrays and tuples(using indexing).


This is not complicated. Someone that knows about the json code 
should do it.

The stringof bug exists too. There is no Stringof.

import std, std.typecons;
void main()
{
     auto X = "asdf";
     writeln(JSONValue(X).toString);
	auto Y = tuple(3.4, "asdf");
     writeln(JSONValue(Y).toString);
}



/dlang/dmd/linux/bin64/../../src/phobos/std/json.d(530): Error: 
no property Stringof for type std.typecons.Tuple!(double, string)
/dlang/dmd/linux/bin64/../../src/phobos/std/json.d(530): Error: 
static assert:  __error
/dlang/dmd/linux/bin64/../../src/phobos/std/json.d(564):        
instantiated from here: assign!(Tuple!(double, string))
onlineapp.d(7):        instantiated from here: 
__ctor!(Tuple!(double, string))


Fixing the Stringof bug won't make it work with tuple though, the 
code I added fixes this though, again, as I've said plenty of 
times, I just made it treat tuples like arrays.


More information about the Digitalmars-d-learn mailing list