Support JSON binding with the JDK's built-in JSON API (`jdk.incubator.json`)

Aperta
#37,610 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
5/5
Tempo stimato
Più di una settimana
Idoneità per principianti
25/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
java, json

Direzione di ricerca

Read the linked proposal and inspect the prototype’s JsonRecordHttpMessageConverter to understand the proposed mapping and constraints. Compare the reflection, generated, hybrid, and tree-only options for spring-web and spring-messaging; done means the project has a decided scope and approach, or has explained why this belongs in a separate library.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

status: waiting-for-triage
Use case

I want to build Spring MVC REST endpoints that read and write Java records as JSON without a third-party JSON library:

@PostMapping("/hello")
public HelloResponse hello(@RequestBody HelloRequest request) { ... }

The same records should also work as Kafka message payloads:

@KafkaListener(topics = "hello")
public void onHello(HelloRequest request) { ... }

JDK 28 ships an incubating JSON API (jdk.incubator.json) that parses JSON into a JsonValue tree and writes it back, but it does not map JSON to Java types.
Spring has HTTP and messaging converters for Jackson, Gson, JSON-B and Kotlin Serialization, but none for the JDK API.

Reasons for a JDK-only option:

  • Fewer dependencies for applications that only need simple JSON.
  • A smaller attack surface: jackson-databind has 86 advisories in OSV, 17 of them published in 2026.
  • GraalVM native images without reflection metadata for the JSON library.
What I have tried so far

A prototype on Spring Boot 4.1 / JDK 28-ea: https://github.com/drnow4u/springboot-jdk28-json

  • JsonRecordHttpMessageConverter, an AbstractHttpMessageConverter<Record> that maps JSON objects to and from records using reflection over record components (String, numeric and boolean types, nested records).
  • Malformed JSON or a wrong value type is mapped to HttpMessageNotReadableException (400).
  • The JDK parser has no size limits and repeats the offending input in its error messages, so the converter limits the body size (413) and shortens error messages.
  • Spring AOT already registers reflection hints for the records used in the controller signature, so option A below may work in a native image; this cannot be verified until GraalVM supports JDK 28.
Questions

The main design question is how the mapping should work:

  • A. Reflection over record components (what the prototype does). No setup, but needs AOT hints for native images.
  • B. Compile-time generated bindings (annotation processor), similar to Kotlin Serialization. No reflection, errors at compile time, but needs a processor on the build path.
  • C. Hybrid: generated bindings when present, reflection otherwise.
  • D. Tree types only: a converter for JsonValue / JsonObject / JsonArray, with mapping left to applications or libraries.

Whichever option is chosen, the mapping would be shared by an HttpMessageConverter (spring-web) and a MessageConverter (spring-messaging, used by @KafkaListener); a Kafka Serializer/Deserializer would belong in Spring for Apache Kafka.

Would the Spring team consider any of these for Spring Framework, and which one? Or should this live in a separate library until the JDK API leaves incubation?

The full proposal, covering security, performance, native image and open questions, is here:
https://github.com/drnow4u/springboot-jdk28-json/blob/main/docs/proposal-jdk-json-binding.md

Lingua principale
Java
Stelle
60.3k
Fork
38.7k
Merge medio
1g 1h
PR unite (30g)
33

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di spring-projects/spring-framework

Tutte le issue di spring-projects/spring-framework

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.