如何将枚举与D中的std.json.JSONValue一起使用?实现代码无法访问模块类型和!不能使用,这就是CommonType!(OriginalType!())调用的原因。
import std.json;
import std.stdio;
import std.traits;
enum Kind : string
{
dog = "Dog",
cat = "Cat",
pony = "Pony"
};
unittest
{
writeln("TEST: std.json.JSONValue for enum");
Kind animal = Kind.dog;
Kind[] pets = [Kind.cat, Kind.dog];
static if (is(typeof(animal) == enum))
{
writeln("enum");
}
//JSONValue a = JSONValue(animal); // <-- Assertion failed: (0), function unqualify, file mtype.c, line 2022.
JSONValue a = JSONValue(cast(CommonType!(OriginalType!(typeof(animal))))animal); // <-- this is OK
static if (is(typeof(pets) == enum))
{
writeln("array of enum");
}
//JSONValue p = JSONValue(pets); // <-- Assertion failed: (0), function unqualify, file mtype.c, line 2022.
//JSONValue p = JSONValue(???);
}
答案 0 :(得分:0)
您可以使用std.conv.to
将您的枚举值转换为字符串并返回。
import std.json;
import std.conv : to;
import std.algorithm : map, equal;
...
Kind animal = Kind.dog;
Kind[] pets = [Kind.cat, Kind.dog];
// convert Kind to string and store in JSONValue
JSONValue json1 = animal.to!string;
// extract string from JSONValue convert to Kind
assert(animal == json1.str.to!Kind);
JSONValue json2 = pets.to!(string[]);
// map JSONValues to strings, then Kinds
auto pets2 = json2.array.map!(x => x.str.to!Kind);
assert(pets2.equal(pets));
使用string
,JSON值将表示为与枚举名称匹配的字符串。您可以使用int
或其他任何可以转换为枚举类型和JSONValue
的内容。