<div dir="ltr">I suppose while I'm asking questions - what exactly are the parts of the JDK making use of ad-hoc json? Maybe we could ship *something* as a jdk.internal module for those use cases?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Nov 24, 2022 at 8:55 PM Ethan McCue <<a href="mailto:ethan@mccue.dev">ethan@mccue.dev</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I'm reading JEP 198 and sketching out what an implementation could look like pursuant to this old conversation.<br><br><a href="https://mail.openjdk.org/pipermail/discuss/2020-April/005401.html" target="_blank">https://mail.openjdk.org/pipermail/discuss/2020-April/005401.html</a><br><br>My biggest question right now is what does the JEP mean exactly by "document context"<br><br><ul><li><span style="color:rgb(0,0,0);font-family:"DejaVu Sans","Bitstream Vera Sans","Luxi Sans",Verdana,Arial,Helvetica">Parsing APIs which allow a choice of parsing token stream, event (includes document hierarchy context) stream, or immutable tree representation views of JSON documents and data streams.</span></li></ul><br style="color:rgb(0,0,0);font-family:"DejaVu Sans","Bitstream Vera Sans","Luxi Sans",Verdana,Arial,Helvetica;font-size:13.3333px"><br style="color:rgb(0,0,0);font-family:"DejaVu Sans","Bitstream Vera Sans","Luxi Sans",Verdana,Arial,Helvetica;font-size:13.3333px">So token stream I understand as something akin to<br><br><font face="monospace">sealed interface Token {<br>    record StartArray() implements Token {}<br></font><span style="font-family:monospace">    record EndArray() implements Token {}<br></span><span style="font-family:monospace">    record StartObject() implements Token {}<br></span><span style="font-family:monospace">    record EndObject() implements Token {}<br></span><span style="font-family:monospace">    record Number(Json.Number value) implements Token {}<br></span><span style="font-family:monospace">    record String(Json.String value) implements Token {}<br></span><span style="font-family:monospace">    record True() implements Token {}<br></span><span style="font-family:monospace">    record False() implements Token {}<br></span><span style="font-family:monospace">    record Null() implements Token {}</span><br style="font-family:monospace"><font face="monospace">}</font><br><br><font face="arial, sans-serif">Which matches up with the model in </font><a href="https://fasterxml.github.io/jackson-core/javadoc/2.7/com/fasterxml/jackson/core/JsonToken.html" target="_blank">https://fasterxml.github.io/jackson-core/javadoc/2.7/com/fasterxml/jackson/core/JsonToken.html</a><br><br>And an immutable tree representation as akin to<br><br><font face="monospace">sealed interface Json {</font><br style="font-family:monospace"><span style="font-family:monospace">    sealed interface Array extends Json, List<Json> ...</span><br style="font-family:monospace"><span style="font-family:monospace">    sealed interface Object extends Json, Map<java.lang.String, Json> ...<br></span><font face="monospace">    sealed abstract class Number </font><font face="monospace">extends java.lang.Number </font><font face="monospace">implements </font><span style="font-family:monospace">Json </span><font face="monospace">...</font><font face="monospace"><br>    sealed interface String extends </font><span style="font-family:monospace">Json, </span><font face="monospace">CharSequence ...</font><font face="monospace"><br>    sealed interface Boolean ...</font><br style="font-family:monospace"><span style="font-family:monospace">    sealed interface Null extends Json ...</span><br style="font-family:monospace"><font face="monospace">}</font><br><br><font face="arial, sans-serif">Which, ignoring the open questions of<br></font>* Does the immutable tree need to be eagerly realized?<br>* Do we need to wait for valhalla to land<br>* Do we need to wait for full pattern matching to land<br><br>(because they make me sad)<br><br>I'm still unsure what information needs to be included in an "Event" stream that would constitute "document context". Is it pointers to parent collections? The current "Path"?<br><br><span style="font-family:monospace">sealed interface PathElement {</span><font face="monospace"><br></font><span style="font-family:monospace">    record Field(String fieldName) implements </span><span style="font-family:monospace">PathElement</span><span style="font-family:monospace"> {}</span><br style="font-family:monospace"><span style="font-family:monospace">    record Index(int index) implements </span><span style="font-family:monospace">PathElement</span><span style="font-family:monospace"> {}<br></span><font face="monospace">}<br></font><br><br><br></div>
</blockquote></div>