<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
<br id="lineBreakAtBeginningOfMessage">
<div><br>
<blockquote type="cite">
<div>On May 19, 2025, at 8:16 AM, Remi Forax <forax@univ-mlv.fr> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12pt;">
<div>Okay,</div>
<div>i've taken a look to the design and this is not pretty.</div>
<div><br data-mce-bogus="1">
</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
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.</div>
<div><br>
</div>
<div><br>
<blockquote type="cite">
<div>
<div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12pt;">
<div>The main issue is that the javadoc claims that</div>
<div>  "Both <code>JsonValue</code> instances and their underlying values are immutable."</div>
<div>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.</div>
<div><br data-mce-bogus="1">
</div>
<div>Because the hierarchy is non sealed, it also means that it is easy to create JsonValue that are invalid,</div>
<div>for example</div>
<div><br data-mce-bogus="1">
</div>
<div>
<div style="background-color: #ffffff; color: #080808;" data-mce-style="background-color: #ffffff; color: #080808;">
<pre style="font-family: 'JetBrains Mono',monospace; font-size: 9.8pt;" data-mce-style="font-family: 'JetBrains Mono',monospace; font-size: 9.8pt;"><span style="color: #0033b3;" data-mce-style="color: #0033b3;">var </span><span style="" data-mce-style="color: #000000;">funJsonNumber </span>= <span style="color: #0033b3;" data-mce-style="color: #0033b3;">new </span>JsonNumber() {<br>  <span style="color: #0033b3;" data-mce-style="color: #0033b3;">public </span><span style="" data-mce-style="color: #000000;">Number </span><span style="color: #00627a;" data-mce-style="color: #00627a;">toNumber</span>() {<br>    <span style="color: #0033b3;" data-mce-style="color: #0033b3;">return </span><span style="" data-mce-style="color: #000000;">Double</span>.<span style="color: #871094; font-style: italic;" data-mce-style="color: #871094; font-style: italic;">NaN</span>;<br>  }<br>  <span style="color: #0033b3;" data-mce-style="color: #0033b3;">public </span><span style="" data-mce-style="color: #000000;">BigDecimal </span><span style="color: #00627a;" data-mce-style="color: #00627a;">toBigDecimal</span>() {<br>    <span style="color: #0033b3;" data-mce-style="color: #0033b3;">throw new </span>UnsupportedOperationException();<br>  }<br>  <span style="color: #0033b3;" data-mce-style="color: #0033b3;">public </span><span style="" data-mce-style="color: #000000;">String </span><span style="color: #00627a;" data-mce-style="color: #00627a;">toString</span>() {<br>    <span style="color: #0033b3;" data-mce-style="color: #0033b3;">return </span><span style="color: #067d17;" data-mce-style="color: #067d17;">"NaN"</span>;<br>  }<br>};<br><br><span style="color: #0033b3;" data-mce-style="color: #0033b3;">var </span><span style="" data-mce-style="color: #000000;">json </span>= Json.fromUntyped(<span style="" data-mce-style="color: #000000;">List</span>.<span style="font-style: italic;" data-mce-style="font-style: italic;">of</span>(<span style="" data-mce-style="color: #000000;">funJsonNumber</span>));</pre>
</div>
</div>
<div><br data-mce-bogus="1">
</div>
<div>For me, the Json hierarchy should be implemented with true ADTs, with all subtypes of JsonValue being records.</div>
<div><br data-mce-bogus="1">
</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
Not doing that for reasons Brian has already explained.</div>
<div><br>
</div>
<div>Paul.</div>
</body>
</html>