Skip to content

Architecture

JSONQL is a layered system with a clear separation of concerns. Every SDK (Go, TypeScript, Java, Python) implements the same pipeline, ensuring consistent behavior across languages.

graph TD
Client["Client JSON"] --> Parser
Parser --> Validator
Validator --> Transpiler
Transpiler --> Driver
Driver --> Hydrator
Hydrator --> Response["JSON Response"]
  1. Client sends a JSONQL query as JSON (via POST body or ?q= query param).
  2. Parser validates the query structure — field names, operators, nesting depth, limits.
  3. Validator checks schema permissions — is this field selectable? Can this relation be included? Is aggregation allowed?
  4. Transpiler converts the JSONQL query into dialect-specific SQL (Postgres, MySQL, SQLite, or MSSQL) or MongoDB aggregation pipeline, with parameterized arguments.
  5. Driver executes the SQL against the database and returns flat rows.
  6. Hydrator takes the flat SQL result set and reconstructs nested JSON, reassembling relationship data from JOINs.
ComponentResponsibilityPresent in
ParserValidate query shape, types, and security limitsAll SDKs
ValidatorSchema-based permission checking (fields, relations, aggregates)All SDKs
TranspilerJSONQL → SQL conversion with dialect awarenessAll SDKs
DialectDatabase-specific SQL syntax (placeholders, quoting, RETURNING)All SDKs
DriverDatabase connection and query executionAll SDKs
HydratorFlat rows → nested JSON reconstructionAll SDKs
BuilderFluent API for constructing JSONQL queries programmaticallyAll SDKs
SchemaTable/field/relation definitions with permissionsAll SDKs
AdapterFramework-specific HTTP integration (routing, request parsing)All SDKs
EngineUnified pipeline orchestrator (parse → validate → transpile → execute → hydrate)Java, Python
graph TD
SPEC["jsonql-spec<br/>Specification + JSON Schema"]
SPEC --> GO["jsonql-go<br/>Gin · Echo · net/http"]
SPEC --> TS["jsonql-ts<br/>Express · Fastify · NestJS"]
SPEC --> JAVA["jsonql-java<br/>Spring Boot · Jakarta EE"]
SPEC --> PY["jsonql-py<br/>Flask · FastAPI · Django"]
GO -->|adapter containers| TESTS["jsonql-tests<br/>63 configurations × 135 tests<br/>PostgreSQL · MySQL · SQLite · MSSQL · MongoDB"]
TS -->|adapter containers| TESTS
JAVA -->|adapter containers| TESTS
PY -->|adapter containers| TESTS
FeatureGoTypeScriptJavaPython
Parser
Validator
QueryBuilder
MutationBuilder
SQL Transpiler
Result Hydrator
Schema Validation
Lifecycle Hooks
Postgres dialect
MySQL dialect
SQLite dialect
MSSQL dialect
MongoDB transpiler
Engine
Framework adapters3323

Every SDK enforces:

  • Parameterized queries — all user values are bound as parameters, never interpolated into SQL
  • Schema permissions — fields, relations, and aggregates are allow-listed
  • Nesting limits — configurable maxNestingDepth prevents DoS via deeply nested queries
  • Pagination limits — configurable maxLimit prevents unbounded result sets
  • No eval / no regex execution — queries are data, not code

JSONQL encourages deterministic query plans and structured logging:

  • Each SDK provides a logger interface for SQL tracing
  • Lifecycle hooks enable instrumentation at parse, transpile, and execute stages
  • The Java and Python SDKs support debug() mode for development logging