JsonPathLib 1.0.0

dotnet add package JsonPathLib --version 1.0.0
                    
NuGet\Install-Package JsonPathLib -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="JsonPathLib" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="JsonPathLib" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="JsonPathLib" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add JsonPathLib --version 1.0.0
                    
#r "nuget: JsonPathLib, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package JsonPathLib@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=JsonPathLib&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=JsonPathLib&version=1.0.0
                    
Install as a Cake Tool

🔍 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 mit id == 5 zurück.

🛠 Architekturüberblick

Die JsonPath-Engine gliedert sich in mehrere Komponenten:

  1. Pfadparser (ParsePathSegments):
    Zerlegt den Abfragepfad in einzelne Segmente (Property, Index, Filter, rekursive Suche).
    Unterstützt explizit das $-Symbol und rekursive Segmente, die mit .. beginnen.

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

  3. 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.
  4. 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 wie contains(), startsWith() usw.

  • Erweiterte Datentyp-Unterstützung:
    Behandlung von null, Booleans und weiteren Datentypen.

  • Integration in ein Interface:
    Umsetzung als IJsonQuery-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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • 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