如何检查JSON数组中是否存在元素?

时间:2016-05-13 06:38:54

标签: json find d

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!stringtoString方法都可以:

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。怎么了?

2 个答案:

答案 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");
}