d04序化数组
原地址
 Person之后仍为构.
JSONValue serialise(T)(T value)
{    
    ...
    else static if(isDynamicArray!T)
    {//在类与构后面.检查`动态数组`.
        JSONValue toReturn = parseJSON("[]");
    //这样创建动态数组,`std.json`有点过时了.
        foreach(element; value)
        {
            toReturn.array~=serialise(element);
        }
        
        return toReturn;
    }
    else
    { /**/ }
}
注意,串在D中为immutable(char)[].因而串也会匹配动态数组.这里串在动态处理前处理.wstring和dstring忽略了.
 区间中std.range#ElementType来获取元素类型.因而前面要用import std.range;导入.
T deserialise(T)(JSONValue json)
{    
    ...
    else static if(isDynamicArray!T)
    {//同样在`类/构`后.
        T toReturn;
        alias ElementT = ElementType!T;
        //这是类型计算.元编程必备
        foreach(element; json.array)
        {
            toReturn ~= deserialise!ElementT(element);
        }
        
        return toReturn;
    }
    else
    { /**/ }
}
注意,如果ElementType为串类,则总是返回dchar,有点烦人.而ElementEncodingType会返回相应char,wchar,和dchar,测试:
void main()
{
    import std.stdio : writeln;
    auto json = ["a", "b", "c"].serialise();
    writeln(json); 
    writeln(json.deserialise!(string[]));
    /*
        输出:
            ["a","b","c"]
            ["a", "b", "c"]
    */
}
关联数组(AA)
在动态数组后序化,静态数组作为作业了:
JSONValue serialise(T)(T value)
{    
    ...
    else static if(isAssociativeArray!T)
    {
        JSONValue toReturn;
        
        alias KeyT = KeyType!T;//键型
        static assert(is(KeyT == string), "仅支持`串`: " ~ KeyT.stringof);
        
        foreach(key, element; value)
        {
            toReturn[key] = serialise(element);
        }
        return toReturn;
    }
    ...
}
//反序
T deserialise(T)(JSONValue json)
{    
    ...//同样在动态数组后.
    else static if(isAssociativeArray!T)
    {
        T toReturn;
        
        alias KeyT   = KeyType!T;//键型
        alias ValueT = ValueType!T; //值型
        
        static assert(is(KeyT == string), "仅支持串,非: " ~ KeyT.stringof);
        
        foreach(key, element; json.object)
        {
            toReturn[key] = deserialise!ValueT(element);
        }
            
        return toReturn;
    }
    else
    { /**/ }
}
测试:
void main()
{
    import std.stdio : writeln;
    auto json = 
    [
        "bradley": Person("Bradley", 20, PersonType.Student), 
        "andy":    Person("Andy", 100, PersonType.Staff)
    ].serialise();
    writeln(json);
    writeln(json.deserialise!(Person[string]));
    /*
        输出:
            {"andy":{"age":100,"name":"Andy","type":"Staff"},"bradley":{"age":20,"name":"Bradley","type":"Student"}}
            ["andy":Person("Andy", 100, Staff), "bradley":Person("Bradley", 20, Student)]
    */
}
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号