On Thursday, 24 March 2016 at 08:15:12 UTC, Andre wrote:
Hi,

I have a class which has already an alias this to a string array,
so I can use it in a foreach loop.

class MyClass
{
        string[] _data;
        alias _data this;
        // ...
}

void main()
{
        import std.json;
        auto jsValue = JSONValue(new MyClass());
}

For some generic code I need an implicit conversion of MyClass so I can use it for a JSONValue. For the coding above I receive a compiler error:
static assert  "unable to convert type "MyClass" to json"


JSONValue only works with the build in types, not with user defined types. Either you define a specific function for the class that returns a JSONValue. Easiest way to do that would be to build an associative array with strings as keys with the names, and JSONValues as values and turn that into JSONValue, i.e. (untested):
class MyClass
{
        string[] _data;
        alias _data this;
        // ...
   JSONValue toJSON()
  {
    JSONValue[string] aa;
    JSONValue[] dataJSON = _data.map!((a) => JSONValue(a)).array;
    aa["data"] = JSONValue(dataJSON);
    return JSONValue(aa);
  }
}

Alternatively there are multiple serialization libraries that will allow you to turn any user defined type from and to JSONValues.

https://code.dlang.org/packages/painlessjson
https://code.dlang.org/packages/jsonizer

Cheers, Edwin

Reply via email to