janestreet / janestreet/ppx_yojson_conv

Derivation of json schemas

Open
#4 1 comment 1 reaction 0 assignees View on GitHub
forwarded-to-js-devs
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.