JsonPathLib 1.0.0
dotnet add package JsonPathLib --version 1.0.0
NuGet\Install-Package JsonPathLib -Version 1.0.0
<PackageReference Include="JsonPathLib" Version="1.0.0" />
<PackageVersion Include="JsonPathLib" Version="1.0.0" />
<PackageReference Include="JsonPathLib" />
paket add JsonPathLib --version 1.0.0
#r "nuget: JsonPathLib, 1.0.0"
#:package JsonPathLib@1.0.0
#addin nuget:?package=JsonPathLib&version=1.0.0
#tool nuget:?package=JsonPathLib&version=1.0.0
🔍 JsonPath for System.Text.Json
Eine leichtgewichtige, leistungsstarke JsonPath-Engine für .NET basierend auf System.Text.Json
.
Diese Bibliothek ermöglicht eine XPath-ähnliche Abfragesyntax für JSON-Daten ohne externe Abhängigkeiten – inkl. komplexer Filter, rekursiver Suche und direktem Zugriff auf die JSON-Wurzel.
🚀 Features
Objekt- und Array-Navigation:
Zugriff auf Eigenschaften (z. B.user.name
) und Array-Indizes (z. B.[0]
,[*]
).Filter mit Vergleichsoperatoren:
Unterstützt Filterausdrücke wie[?(@.id == 5)]
,[?(@.age > 18)]
,[?(@.score <= 3.5)]
und mehr.Logische Operatoren und Gruppierungen:
Kombination von Bedingungen mit&&
(UND) und||
(ODER) sowie Gruppierung mittels Klammern
z. B.:[?((@.id > 10 && @.name == "Test") || @.id == 5)]
.Rekursive Suche:
Durch das..
-Symbol können Sie rekursiv nach allen Vorkommen eines Schlüssels suchen, z. B.:$..name
.$-Wurzelunterstützung:
Mit dem$
-Symbol beginnt die Abfrage immer an der Wurzel des JSON-Dokuments – egal ob Wurzel ein Array oder ein Objekt ist.
Beispielsweise:$.user.name
oder$..id
.Flexibilität bei der Wurzel:
Die JSON-Struktur muss nicht mehr zwingend in einem Array liegen – sowohl JSON-Objekte als auch Arrays werden unterstützt.
📦 Installation
Fügen Sie die Quelldateien (z. B. JsonPath.cs
, ExpressionParser.cs
, ExpressionNode.cs
und zugehörige Hilfsklassen) Ihrem Projekt hinzu.
Stellen Sie sicher, dass Ihr Projekt System.Text.Json
referenziert (standardmäßig ab .NET Core 3.0 verfügbar).
🧭 Syntaxunterstützung
Ausdruck | Beschreibung |
---|---|
$ |
Zugriff auf die JSON-Wurzel (Objekt oder Array) |
property |
Zugriff auf eine Eigenschaft eines Objekts |
[0] |
Zugriff auf das Element an Index 0 eines Arrays |
[*] |
Zugriff auf alle Elemente eines Arrays |
[?(@.id == 5)] |
Filter: Gibt alle Elemente zurück, bei denen id gleich 5 ist |
[?(@.age > 18 && @.name != "x")] |
Kombinierter Filter mit logischen Operatoren und Gruppierungen |
..name |
Rekursive Suche: Gibt alle Werte zurück, deren Schlüssel name lautet |
💡 Beispiel
Angenommen, Sie haben folgende JSON-Daten:
Beispiel 1: JSON als Objekt
{
"user": {
"id": 15,
"name": "Alice",
"details": {
"email": "alice@example.com",
"name": "Alice A."
}
}
}
Abfragen:
Zugriff auf den Namen des Benutzers:
var result = jp.Select("$.user.name");
Rekursive Suche nach allen "name"-Feldern:
var result = jp.Select("$..name");
Beispiel 2: JSON als Array
[
{ "id": 5, "name": "A" },
{ "id": 15, "name": "Test" },
{ "id": 20, "name": "X", "flag": "yes" }
]
Abfrage:
var jp = new JsonPath(json);
var result = jp.Select("[?((@.id > 10 && @.name == \"Test\") || @.id == 5)]");
foreach (var item in result)
{
Console.WriteLine(item);
}
Ergebnis:
- Gibt das Element mit
id == 15 && name == "Test"
sowie das Element mitid == 5
zurück.
🛠 Architekturüberblick
Die JsonPath-Engine gliedert sich in mehrere Komponenten:
Pfadparser (
ParsePathSegments
):
Zerlegt den Abfragepfad in einzelne Segmente (Property, Index, Filter, rekursive Suche).
Unterstützt explizit das$
-Symbol und rekursive Segmente, die mit..
beginnen.Filterparser:
Filterausdrücke (z. B.[?(@.id > 10 && @.name == "Test")]
) werden mithilfe eines rekursiven Abwärtsparsers in einen abstrakten Syntaxbaum (AST) übersetzt.
Dabei kommen spezialisierte AST-Knoten (ConditionNode, AndNode, OrNode) zum Einsatz.Auswertung:
- Jedes Pfadsegment wird nacheinander auf die aktuelle Menge an
JsonElement
-Objekten angewendet. - Bei Filtersegmenten wird der Ausdruck gegen jedes Element evaluiert.
- Die rekursive Suche (
..
) durchläuft alle untergeordneten Objekte und Arrays, um Treffer für den gesuchten Schlüssel zu finden. - Das Endergebnis ist eine Liste von
JsonElement
-Treffern, die der Abfrage entsprechen.
- Jedes Pfadsegment wird nacheinander auf die aktuelle Menge an
Wurzelunterstützung:
Mit dem$
-Symbol kann der Benutzer explizit angeben, dass die Abfrage an der JSON-Wurzel startet – egal ob diese ein Objekt oder ein Array ist.
🔧 Erweiterungsmöglichkeiten
Weitere Filterfunktionen:
Unterstützung für Funktionen wiecontains()
,startsWith()
usw.Erweiterte Datentyp-Unterstützung:
Behandlung vonnull
, Booleans und weiteren Datentypen.Integration in ein Interface:
Umsetzung alsIJsonQuery
-Interface für flexiblere Erweiterungen oder Plug-in-Architekturen.CI/CD & UnitTests:
Aufbau einer vollständigen Testabdeckung und automatisierten Tests (z. B. mit xUnit oder NUnit).
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
1.0.0 | 173 | 4/1/2025 |