2016-05-13 7 views
0
Json test = Json.emptyArray; 
test ~= "aaa"; 
test ~= "bbb"; 
test ~= "ccc"; 
writeln(test); 

Ausgang: ["aaa","bbb","ccc"]Wie überprüft man, ob ein Element im JSON-Array existiert?

aber wie kann ich überprüfen, wenn dieses Array-Element haben? Ich kann mir nicht vorstellen, wie man canFind mit JSON-Array verwendet. Ich verwende vibed json module.

if(test.get!string[].canFind("aaa")) 
{ 
    writeln("founded"); 
} 

funktioniert nicht: Got JSON of type array, expected string.

Wenn wie dies zu tun:

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."

Mit to!string und toString Methoden alle Arbeiten:

Json test = Json.emptyArray; 
test ~= "aaa"; 
test ~= "bbb"; 
test ~= "ccc"; 
writeln(to!string(test)); 

if(test.toString.canFind("aaa")) 
{ 
    writeln("founded"); 
} 

Aber wenn ich es innen foreach tun:

foreach(Json v;visitorsInfo["result"]) 
{ 
if((v["passedtests"].toString).canFind("aaa")) 
{ 
    writeln("founded"); 
} 
} 

Ich erhalte: Error: v must be an array or pointer type, not Json. Was ist los mit dir?

+1

Können Sie versuchen, Klammern um Ihre Zeichenfolge [] zu setzen? Wie .get! (string []). canFind –

+0

Ich habe den Code aktualisiert. Ist es möglich, dass ich Fehler bekomme, wenn ich Array an 'writeln' übergebe? Ist es das Drucken von Arrays? –

+0

Ja, tut mir leid. War am Telefon, also los! (String []) wird nicht funktionieren. Es muss in einen dieser Typen konvertiert werden: http://vibed.org/api/vibe.data.json/Json.get –

Antwort

5

JSON Array-Objekte Arrays von anderen JSON Elemente sind. Sie sind keine Arrays von Strings, weshalb elem.get!(string[]) zur Kompilierzeit fehlschlägt.

Schneiden Sie das JSON-Element ab, um ein Array von Unterelementen zu erhalten, und verwenden Sie dann das Prädikat-Argument canFind, um eine Zeichenfolge von jedem der Unterelemente abzurufen.

writeln(test[].canFind!((a,b) => a.get!string == b)("foo")); 
+1

Ich bevorzuge diese Lösung sehr. Hatte nicht einmal realisiert, dass canFind ein Prädikat annehmen konnte! –

0

Das funktioniert - obwohl ist nicht besonders nett.

void main(){ 

    Json test = Json.emptyArray; 

    test ~= "foo"; 
    test ~= "bar"; 
    test ~= "baz"; 

    foreach(ele; test){ 
     if(ele.get!string == "foo") { 
      writeln("Found 'foo'"); 
      break; 
     } 
    } 
} 

könnte es in eine Hilfsfunktion gesetzt, so wie:

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