Json + D - 如何为JSONValue设置节点类型?

时间:2014-04-25 05:36:11

标签: json d dmd

这是我的代码:

JSONValue generateJsonValue(Value input)
{
    JSONValue ret;
    switch (input.type)
    {
        case ValueType.numberValue      :   ret.type = JSON_TYPE.UINTEGER; ret.uinteger = input.content.i; return ret;
        case ValueType.realValue        :   ret.type = JSON_TYPE.FLOAT;    ret.floating = input.content.r; return ret;
        case ValueType.stringValue      :   ret.type = JSON_TYPE.STRING;   ret.str = input.content.s; return ret;
        case ValueType.booleanValue     :   ret.type = JSON_TYPE.INTEGER;  ret.integer = to!int(input.content.b); return ret;
        case ValueType.arrayValue       :   {
            ret.type = JSON_TYPE.ARRAY;
            for (int i=0; i<input.content.a.length; i++)
            {
                ret[i] = generateJsonValue(input.content.a[i]);
            }
            return ret;
        }
        case ValueType.dictionaryValue  :   {
            ret.type = JSON_TYPE.OBJECT;
            foreach (Value kv, Value vv; input.content.d)
            {
                ret[kv.str()] = generateJsonValue(vv);
            }
            return ret;
        }
        default : break;
    }

    return ret; // won't reach here
}

错误: 编译器抱怨我试图设置type属性。

  

错误:函数std.json.JSONValue.type()const不可调用   参数类型(JSON_TYPE)

我做错了什么?是不是它是如何使用的? (我已经看过官方的 std.json 文档和in the forums了 - 但仍然无法弄明白这一点。

2 个答案:

答案 0 :(得分:3)

如果您使用的是DMD2.065 +,则无需设置类型即可直接更改JSONValue。进行此更改是为了提供内存安全的API。例如:

import std.json, std.stdio;

void main() {
    JSONValue nJ = 5;
    JSONValue sJ = "hello";
    JSONValue bJ = true;
    JSONValue aJ = [1, 2];
    JSONValue oJ1 = ["i": JSONValue(2), "s": JSONValue("str"), "arr": JSONValue([1, 2, 3])]; // different value types
    JSONValue oJ2 = ["a": 1, "b": 2, "c": 3]; // same value type
    writeln(nJ.toString());
    writeln(sJ.toString());
    writeln(bJ.toString());
    writeln(aJ.toString());
    writeln(oJ1.toString());
    writeln(oJ2.toString());
}

答案 1 :(得分:0)

我不确定我的方法是否正确(好吧,无论如何都很好),但在仔细研究std/json.d(模块的实现)之后,这就是我最终的结果用:

JSONValue generateJsonValue(Value input)
{
    JSONValue ret;
    switch (input.type)
    {
        case ValueType.numberValue      :   ret = input.content.i; return ret;
        case ValueType.realValue        :   ret = input.content.r; return ret;
        case ValueType.stringValue      :   ret = input.content.s; return ret;
        case ValueType.booleanValue     :   ret = to!int(input.content.b); return ret;
        case ValueType.arrayValue       :   {
            JSONValue[] result;
            for (int i=0; i<input.content.a.length; i++)
            {
                result ~= generateJsonValue(input.content.a[i]);
            }
            ret = result;
            return ret;
        }
        case ValueType.dictionaryValue  :   {
            JSONValue[string] result;
            foreach (Value kv, Value vv; input.content.d)
            {
                result [kv.str()] = generateJsonValue(vv);
            }
            ret = result;
            return ret;
        }
        default : break;
    }

    return ret; // won't reach here
}

提示:如果您无法直接设置type,也无法访问私有type_tag,请将其设为...猜测类型..哈哈。


PS 我认为ret = input.content.i等(推断出int值)也可以正常工作。(FIXED)