将enum与std.son.JSONValue一起使用

时间:2015-02-13 11:38:44

标签: d

如何将枚举与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(???);
}

1 个答案:

答案 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的内容。