【D言語】std.jsonが使いづらい【Phobos】

先日、仕事でD言語を書いたのですが、ちょっとstd.jsonが使いづらくて困りました。

JSONValueを作り、そこからJSONのstringを作りたい時、 下のようなコードを書くことになります。


import std.json, std.stdio;

void main()
{
    JSONValue json;

    json.type = JSON_TYPE.OBJECT;
    json.object["hoge"] = JSONValue();
    json.object["hoge"].type = JSON_TYPE.STRING;
    json.object["hoge"].str = "piyo";
    json.object["pi"] = JSONValue();
    json.object["pi"].type = JSON_TYPE.INTEGER;
    json.object["pi"].integer = 3141592;

    (&json).toJSON().writeln();
}

なぜtoJSONの引数がin JSONValue*なのかが気になります。 in ref JSONValueじゃダメなんでしょうか・・・ さらに、いちいちtypeを設定しないけないのが面倒くさいです。 このへんは、opAssignを定義すれば解決できそうです。


import std.stdio;

enum JSON_TYPE
{
    STRING, INTEGER, OBJECT
}

struct JSONValue
{
    union
    {
        string str;
        long integer;
        JSONValue[string] object;
    }

    JSON_TYPE type;

    void opAssign(long v)
    {
        type = JSON_TYPE.INTEGER;
        integer = v;
    }

    void opAssign(string v)
    {
        type = JSON_TYPE.STRING;
        str = v;
    }
}

void main()
{
    JSONValue json;

    json.type = JSON_TYPE.OBJECT;
    json.object["hoge"] = "piyo";
    json.object["pi"] = 3141592;
}

随分すっきりしました。

担当:美馬(すっきりするとは言っても、object関連はうまく行かなくて困る)