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)
{ /**/ }
}
浙公网安备 33010602011771号