On May 19, 2025, at 8:16 AM, Remi Forax <fo...@univ-mlv.fr> wrote:
Okay, i've taken a look to the design and this is not pretty. That seems an exaggerated statement to me. It's a trade-off, a compromise, allowing others to implement their own parsers, perhaps from non-textual representations. So of course we cannot enforce certain constraints and we need to specify how implementations must behave. The main issue is that the javadoc claims that "Both JsonValue instances and their underlying values are immutable." but at the same time any subtypes of JsonValue is non-sealed so anyone can implement let say JsonString and adds it's own mutable implementation. Because the hierarchy is non sealed, it also means that it is easy to create JsonValue that are invalid, for example var funJsonNumber = new JsonNumber() { public Number toNumber() { return Double.NaN; } public BigDecimal toBigDecimal() { throw new UnsupportedOperationException(); } public String toString() { return "NaN"; } }; var json = Json.fromUntyped(List.of(funJsonNumber)); For me, the Json hierarchy should be implemented with true ADTs, with all subtypes of JsonValue being records. Not doing that for reasons Brian has already explained. Paul.