01序化基本类型

原地址
用编译时内省/反射来序化对象.仅用std.json.

原始类型

类型详细
整数byte,short,int,long及他们的版(ubyte,ushort)等.
浮数float,double,和real我们不关心.
true或false
utf8,忽略

序化原始类型

import std.json;
JSONValue serialise(T)(T value)
{
    return JSONValue(value);
}//数格值
void main()
{
    import std.stdio : writeln;
    JSONValue json;
    // 用`整`来直接指定类型
    json = serialise!int(420);
    writeln(json); // 420

    //编译器可自动推导,此时T为串
    json = serialise("你好,世界");
    writeln(json); //"你好,世界"
}

静如编译时运行,不创建域,如:

const bool SHOULD_LOG = true; //编译时可用值
void main()
{
    import std.stdio : writeln;
    static if(SHOULD_LOG)
    {
        writeln("日志");
    }

    writeln("完成!");
}

SHOULD_LOG,则编译进程序,否则忽略掉该块.现在反序化原始类型:

T deserialise(T)(JSONValue json)
{
    assert(false, "未实现");
}

现在用静如,是来扩展:

T deserialise(T)(JSONValue json)
{
    static if(is(T == string))
    {//是式
        return json.str;//这是转换函数.
    }//可转为`串/整/极/浮`等.
    else static if(is(T == bool)) 
    //注意,else static if,
    {
        return json.boolean;
    }
    else
    {
        static assert(false,"不知如何解序化" ~ T.stringof);//`静断`给出编译时错误消息.
    }
}

静如类似C++如常式.因为要转化浮/双精.加上特征,现在:

import std.json, std.traits;
T deserialise(T)(JSONValue json)
{
    static if(is(T == string))
    { /* ... */ }
    else static if(is(T == bool))
    { /* ... */ }
    else static if(isFloatingPoint!T)
    {
        return json.floating.to!T();
    }//是浮点就转为浮.正常是`to!T(json.floating`,现在`UFCS`
    else
    { /* ... */ }
}

然后,区分正/整.

T deserialise(T)(JSONValue json)
{
    //...前略,放在`是浮点!T`后.
    else static if(isSigned!T)
    {
        return json.integer.to!T();
    }
    else static if(isUnsigned!T)
    {
        return json.uinteger.to!T();
    }
    else
    //后略...
}

测试下:

void main()
{
    import std.stdio;
    JSONValue foo;

    foo = serialise("你好,世界!");
    writeln(foo); //你好,世界!
    writeln(deserialise!string(foo)); //你好,世界!
    foo = 500.serialise(); //UFCS
    writeln(foo); // 500
    writeln(foo.deserialise!short()); // 500
}

附注

还可以这样分解:

string deserialise(T)(JSONValue json)
if(is(T == string))
{ /*处理串*/ }

T deserialise(T)(JSONValue json)
if(isFloatingPoint!T)
{ /*浮点和双精*/ }

// 整数
T deserialise(T)(JSONValue json)
if(isIntegral!T)
{
    static if(isSigned!T)
    { /**/ }
    else static if(isUnsigned!T)
    { /**/ }
}

可以结合这一篇来看.

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