<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Oct 4, 2012, at 9:02 PM, Rick Waldron wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">
    <div id="reply-content"><br></div><div id="6477236389B9483BB0CCD7DF66DAB141"><div><br></div></div><p style="color: #A0A0A8;">On Thursday, October 4, 2012 at 9:29 PM, Allen Wirfs-Brock wrote:</p>
    <blockquote type="cite" style="border-left-style:solid;border-width:1px;margin-left:0px;padding-left:10px;">
        <div id="quoted-message-content"><div><br><div><div>On Oct 4, 2012, at 5:32 PM, Rick Waldron wrote:</div><br><blockquote type="cite"><div><br><br><div>On Thu, Oct 4, 2012 at 8:16 PM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.org" target="_blank">brendan@mozilla.org</a>></span> wrote:<br><blockquote type="cite"><div>

<div>Nicholas C. Zakas wrote:<br><blockquote type="cite"><div>
I agree, I'm not sure there is a rational default for Map, but I think there is one for Set as an array (and it seems like most people agreed).<br>
</div></blockquote><br></div>
As with Set, I claim the default JSON for Map should be<br>
<br>
  [[key1, value1], ~~~ [keyN, valueN]]<br></div></blockquote><div><br></div><div><br></div><div>I'm still curious about my question from yesterday; instead of repasting, I put it in a gist:</div><div><br></div><div><a href="https://gist.github.com/3837337">https://gist.github.com/3837337</a></div>

<div><br></div></div></div></blockquote><br></div><div><br></div><div>Something like: </div><div><br></div><div>          {"<kind>" : "Map",</div><div>           "<mapData>" : [</div><div>                      [ key1, value1],</div><div>                      [ keyN, valueN]</div><div>                      ]</div><div>             }</div><div><br></div><div>is arguably a better because then you can write a  reviver function that recognizes it:</div><div><br></div><div><pre><div id="LC1"><pre style="position: fixed; left: -1000px;">function mapReviver(key, value) {<br>   if (typeof value != "object") return value;<br>   switch (value["<kind>"]) {<br>      case undefined: return value;<br>      case "Map": {<br>         let newValue = new Map;<br>         let mapData = value["<mapData>"];<br>         if (!mapData) return value;<br>         mapData.forEach(function(e){newValue.set(e[0], e[1])});<br>         return newValue;<br>         }<br>      default: return value;<br>    }<br>}<br></pre><div><pre style="position: fixed; left: -1000px;">function mapReviver(key, value) {<br>   if (typeof value != "object") return value;<br>   switch (value["<kind>"]) {<br>      case undefined: return value;<br>      case "Map": {<br>         let newValue = new Map;<br>         let mapData = value["<mapData>"];<br>         if (!mapData) return value;<br>         mapData.forEach(function(e){newValue.set(e[0], e[1])});<br>         return newValue;<br>         }<br>      default: return value;<br>    }<br>}<br></pre><div><pre style="position: fixed; left: -1000px;">function mapReviver(key, value) {<br>   if (typeof value != "object") return value;<br>   switch (value["<kind>"]) {<br>      case undefined: return value;<br>      case "Map": {<br>         let newValue = new Map;<br>         let mapData = value["<mapData>"];<br>         if (!mapData) return value;<br>         mapData.forEach(function(e){newValue.set(e[0], e[1])});<br>         return newValue;<br>         }<br>      default: return value;<br>    }<br>}<br></pre><div><pre style="position: fixed; left: -1000px;">function mapReviver(key, value) {<br>   if (typeof value != "object") return value;<br>   switch (value["<kind>"]) {<br>      case undefined: return value;<br>      case "Map": {<br>         let newValue = new Map;<br>         let mapData = value["<mapData>"];<br>         if (!mapData) return value;<br>         mapData.forEach(function(e){newValue.set(e[0], e[1])});<br>         return newValue;<br>         }<br>      default: return value;<br>    }<br>}<br></pre><div><pre style="position: fixed; left: -1000px;">function mapReviver(key, value) {<br>   if (typeof value != "object") return value;<br>   switch (value["<kind>"]) {<br>      case undefined: return value;<br>      case "Map": {<br>         let newValue = new Map;<br>         let mapData = value["<mapData>"];<br>         if (!mapData) return value;<br>         mapData.forEach(function(e){newValue.set(e[0], e[1])});<br>         return newValue;<br>         }<br>      default: return value;<br>    }<br>}<br></pre><div><pre style="position: fixed; left: -1000px;">function mapReviver(key, value) {<br>   if (typeof value != "object") return value;<br>   switch (value["<kind>"]) {<br>      case undefined: return value;<br>      case "Map": {<br>         let newValue = new Map;<br>         let mapData = value["<mapData>"];<br>         if (!mapData) return value;<br>         mapData.forEach(function(e){newValue.set(e[0], e[1])});<br>         return newValue;<br>         }<br>      default: return value;<br>    }<br>}<br></pre><div>function mapReviver(key, value) {
   if (typeof value != "object") return value;
   switch (value["<kind>"]){
      case undefined: return value;
      case "Map": {
         let newValue = new Map;
         let mapData = value["<mapData>"];
         if (!mapData) return value;
         mapData.forEach(e=>newValue.set(e[0], e[1]));
         return newValue;
         }
      default: return value;
    }
}
</div></div></div></div></div></div><div><br></div><div><span style="font-family: Helvetica; white-space: normal; ">var tree = JSON.parse(sourceString, mapReviver);</span></div></div></pre></div></div></div></blockquote><div><br></div><div>But, this still doesn't explain how an object-as-key gets its reference put back into (the correct) scope :)</div></blockquote><br></div><div><br></div><div>Ah, it doesn't by itself.  JSON serialization doesn't preserve identify either within a single JSON document or with source or target object context. Admittedly an issue if you need to serialize a Map that has object keys.   You need to add an identify mapping layer to the JSON scheme you produce to make something like that work.  Again, these are things that probably don't have a general solution and are probably better handled close to the application layer.</div><div><br></div><div>Allen</div><br></body></html>