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