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号