Json test = Json.emptyArray;
test ~= "aaa";
test ~= "bbb";
test ~= "ccc";
writeln(test);
输出:["aaa","bbb","ccc"]
但是如何检查这个数组是否有元素?我无法计算如何将canFind
与JSON数组一起使用。我正在使用vibed json module。
if(test.get!string[].canFind("aaa"))
{
writeln("founded");
}
不起作用:Got JSON of type array, expected string.
如果这样做:
if(test.get!(string[]).canFind("aaa"))
{
writeln("founded");
}
Error: static assert "Unsupported JSON type 'string[]'. Only bool, long, std.bigint.BigInt, double, string, Json[] and Json[string] are allowed."
使用to!string
和toString
方法都可以:
Json test = Json.emptyArray;
test ~= "aaa";
test ~= "bbb";
test ~= "ccc";
writeln(to!string(test));
if(test.toString.canFind("aaa"))
{
writeln("founded");
}
但如果我在foreach中做到这一点:
foreach(Json v;visitorsInfo["result"])
{
if((v["passedtests"].toString).canFind("aaa"))
{
writeln("founded");
}
}
我得到了:Error: v must be an array or pointer type, not Json
。怎么了?
答案 0 :(得分:5)
JSON数组对象是其他JSON元素的数组。它们不是字符串数组,这就是elem.get!(string[])
在编译时失败的原因。
切片JSON元素以获取子元素数组,然后使用canFind
的谓词参数从每个子元素中获取字符串。
writeln(test[].canFind!((a,b) => a.get!string == b)("foo"));
答案 1 :(得分:0)
这有效 - 虽然不是特别好。
void main(){
Json test = Json.emptyArray;
test ~= "foo";
test ~= "bar";
test ~= "baz";
foreach(ele; test){
if(ele.get!string == "foo") {
writeln("Found 'foo'");
break;
}
}
}
可以把它放在像这样的辅助函数中:
bool canFind(T)(Json j, T t){
assert(j.type == Json.Type.array, "Expecting json array, not: " ~ j.type.to!string);
foreach(ele; j){
// Could put some extra checks here, to ensure ele is same type as T.
// If it is the same type, do the compare. If not either continue to next ele or die
// For the purpose of this example, I didn't bother :)
if(ele.get!T == t){
return true;
}
}
return false;
}
// To use it
if(test.canFind("foo")){
writefln("Found it");
}