ppx: add [@json.catch_all] for forward-compatible string enums - #88
Merged
Merged
Conversation
For polymorphic and classic variants under [@@deriving json], the [@json.catch_all] attribute marks the constructor that absorbs any unknown wire tag, lossless. The constructor's argument is Melange_json.unknown_variant_case, a record with fields { tag : string; payload : Melange_json.t list option }; payload distinguishes bare strings (None) from array forms (Some xs), so the decoder captures both wire shapes and the encoder re-emits them faithfully. Pairs naturally with [@@json.compact_variants] so the known cases are bare strings. Also ships unknown_variant_case_jsonschema on the native side, structurally compatible with ppx_deriving_jsonschema_runtime.t (no hard dependency).
ahrrv
force-pushed
the
raman/json-open-enum
branch
from
May 20, 2026 07:37
a63a4e7 to
71e6704
Compare
andreypopp
approved these changes
May 20, 2026
jchavarri
added a commit
that referenced
this pull request
Jun 29, 2026
* main: (40 commits) Respect nonrec type declarations in json derivers (#94) ppx/test: cover encode behavior for @drop_default variants (#84) allow @@compact_variants to parse ["Tag"] in addition to "Tag" for nullary variants (#93) Make extra JSON fields allowed by default (#92) Fix error messages for `[@@json.compact_variants]` (#91) Revert "Fix error message for @@compact_variants" (#90) Fix error message for @@compact_variants (#87) ppx: add [@json.catch_all] for forward-compatible string enums (#88) classify: filter undefined values from JS objects (#86) Add primitives semantics table to readme (#82) Support @json.compact_variants on polyvariant types (#79) ppx: allow dropping arbitrary values with `[@drop_default]` (#77) .gitignore: .claude upgrade ppxlib to 0.36 / handle Ptyp_open (#60) build with Melange 6 / OCaml 5.4 (#72) fmt: format using OCamlformat 0.28 (#75) fix: use `opam-check-npm-deps` compatible with OPAM 2.5 (#74) native: re_export yojson browser: remove dup of_json_error_to_string native: +of_json_error_to_string ...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
For polymorphic and classic variants under
[@@deriving json], the[@json.catch_all]attribute marks the constructor that absorbs any unknown wire tag, lossless. The constructor's argument isMelange_json.unknown_variant_case, a record with fields{ tag : string; payload : Melange_json.t list option }; payload distinguishes bare strings (None) from array forms (Some xs), so the decoder captures both wire shapes and the encoder re-emits them faithfully.Pairs naturally with
[@@json.compact_variants]so the known cases are bare strings.Also ships
unknown_variant_case_jsonschemaon the native side, structurally compatible withppx_deriving_jsonschema_runtime.t(no hard dependency).