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)]
    */
}
posted @   zjh6  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示