这是我的代码:
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了 - 但仍然无法弄明白这一点。
答案 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 我认为(FIXED)ret = input.content.i
等(推断出int
值)也可以正常工作。