janestreet / janestreet/ppx_yojson_conv
Derivation of json schemas
- Dominant language
- OCaml
- Stars
- 70
- Forks
- 11
- PR merge metrics
- No merged PRs in 30d
Description
Feature request:
I'd be interested in automatically generating a json schema (in the sense of [https://json-schema.org](https://json-schema.org)) out of an OCaml type definition. A json schema is describing a subset of all jsons and can be seen as a json type or a validity criterion on a json structure. Say if I have an OCaml type `ty = ... [@@deriving yojson]`, the json structures produced by `yojson_of_ty`, when applied to OCaml values of type `ty`, would be json structures abiding by the schema.
Ideally the schema would capture exactly the image of `yojson_of_ty`, but I expect the notion of json schema to be less expressive than OCaml's type system (e.g., I don't think json schemas have polymorphism and I think that in a json schema, all elements of JSON arrays must have the same type --which would be problematic for the encoding of OCaml's tuples as json arrays)...
...so for the moment what would be enough is producing a json schema that captures the image of `yojson_of_ty` for a simple class of OCaml types `ty` (no tuples, all constructors have "record-like / named arguments", etc), and perhaps producing a reasonable superset of that image when `ty` is outside that class.
Has anybody heard of a project doing what I need?
- Json_schema in [ocplib-json-typed](https://github.com/OCamlPro/ocplib-json-typed) has a representation of schemas (which are themselves jsons) but I see no deriver;
- [ATD](https://atd.readthedocs.io/en/latest/index.html) offers its own notion of json type (from what I understand), whose expressivity may be well-suited to my use case, but the tool seems to offer a one way street towards OCaml code generation, while I need the reverse direction: producing json schemas from types in existing OCaml code;
- [ppx_deriving_yojson](https://github.com/ocaml-ppx/ppx_deriving_yojson) seems to be the same kind of ppx deriver as ppx_yojson_conv and, just like [Milk](https://jaredforsyth.com/posts/announcing-milk/), they both seem to offer value-level serialization/deserialization while I need type-level "serialization";
- [ppx_yojson](https://github.com/NathanReb/ppx_yojson) does something different (though very useful).
Contributor guide
Research direction
Start by reviewing ppx_yojson_conv alongside the cited ppx_deriving_yojson and ocplib-json-typed Json_schema representation. Define a minimal supported class of OCaml types, such as record-like named-argument constructors, and establish how generated schemas should correspond to yojson_of_ty output; document behavior for types outside that class.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- ocaml
- Domain
- tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100