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)
{ /**/ }
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现