2017-04-30 6 views
0

Unter Verwendung der folgenden JSON (von http://jsonpath.com):Wie ein nicht-Array in JsonPath filtern

{ 
    "firstName": "John", 
    "lastName" : "doe", 
    "age"  : 26, 
    "address" : { 
    "streetAddress": "naist street", 
    "city"   : "Nara", 
    "postalCode" : "630-0192" 
    }, 
    "phoneNumbers": [ 
    { 
     "type" : "iPhone", 
     "number": "0123-4567-8888" 
    }, 
    { 
     "type" : "home", 
     "number": "0123-4567-8910" 
    } 
    ] 
} 

Ich möchte das Root-Objekt erhalten, nur wenn vorName John ist.

Ich habe diese Eingänge und viele andere ähnliche versucht:

  • $.[?($.firstName == 'John')]
  • $.[?($.'firstName' == 'John')]
  • $.[?(@.firstName == 'John')]
  • $[?($.firstName == "John")]

Es scheint, als ob Filterung nur für Arrays gedacht Dies ist also eine nicht unterstützte Funktion . Kennt jemand einen Weg, dies in Json.NET zu tun, oder bestätigen Sie, dass es nicht möglich ist, und vielleicht verweisen Sie mich auf eine Bibliothek, die das oben genannte unterstützt?

Ich verwende F #, aber das ist nicht wichtig, weil F # mit C#, .NET und NuGet-Paketen kompatibel ist.

+0

Möglicherweise nicht implementiert oder funktionsfähig. Siehe [Problem # 1256: JSONPath-Skripts werden nicht ordnungsgemäß für Objekte ausgeführt] (https://github.com/JamesNK/Newtonsoft.Json/issues/1256). Allerdings finden Sie unter [Newtonsoft JSON.Net SelectToken Issue] (https://stackoverflow.com/q/39442443/3744182) eine Problemumgehung für ein ähnliches Problem. Versuchen Sie tatsächlich, das Stammobjekt zu finden? – dbc

+0

Ich habe versucht, zu testen, ob eine gegebene Eigenschaft einer gegebenen Zeichenfolge entspricht, und wenn ja, gebe das gesamte Root-Objekt zurück. Andys Antwort unten zeigt, dass mein Ansatz falsch war. –

Antwort

1

Der JSON-Pfad dient dazu, Daten in einem JSON-Objekt zu suchen und keine Verarbeitung oder Tests für diese Daten durchzuführen. Die Filternotation wird verwendet, um ein Element in einem Array mit dem Zweck zu identifizieren, diese Daten oder einen Teil davon zurückzugeben. Objekte in einem Array zu haben bedeutet, dass es viele Eigenschaften mit demselben Namen geben kann, die auf andere Weise gefiltert werden müssen, um eine Teilmenge davon auszuwählen.
Die Verwendung der Filternotation für eine Objekteigenschaft ist nicht dasselbe. Es kann nur eine Eigenschaft in einem Objekt mit einem bestimmten Namen geben, so dass der Name ausreicht, um ihn eindeutig zu identifizieren. Sie können den gewünschten Effekt leicht erzielen, indem Sie $ .firstName erhalten und dann separat nach dem Wert "John" testen.