<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Found previous email from Douglas Crockford, included below.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I will proceed with this, as long as you want to include something like:</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>“tag”: “meta”</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>or </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>“tag”: “unit”</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>or </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>“tag”: “component”</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>as object field in each JSON object made a child of head.   This was similar to  my original JSON proposed encoding and others, but using $ for tag like JSON5 for all objects.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Otherwise, I see no way forward except to modify most  JSON (JavaScript) string parsers (or write our own exclusive one).</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Please try parsing and generating your proposed JSON in a Java JSON parser/generator. Roundtripping JSON is important too!</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>An example will help!</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks!</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>John</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='border:none;padding:0in'><b>From: </b><a href="mailto:douglas@crockford.com">Douglas Crockford</a><br><b>Sent: </b>Monday, February 23, 2015 3:24 PM<br><b>To: </b><a href="mailto:brutzman@nps.edu">Don Brutzman</a>; <a href="mailto:yottzumm@gmail.com">John Carlson</a><br><b>Subject: </b>Re: [x3dom-users] simple X3D -> JSON -> X3DOM, D3.js</p></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I recommend failing on duplicate keys.</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>On 2015-02-23 1:21 PM, Don Brutzman wrote:</p><p class=MsoNormal>> Thanks John.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Our goal with trying to find a good X3D encoding using JSON is to </p><p class=MsoNormal>> support programmers who might want to load scene data into a </p><p class=MsoNormal>> javascript program.  Our objective is to represent the scene graph </p><p class=MsoNormal>> information, no more no less, just like the XML and ClassicVRML and </p><p class=MsoNormal>> Compressed Binary programs.  How that information is utilized and </p><p class=MsoNormal>> adapted by the programmer (or library loader) is up to them.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Many XML documents have duplicates of elements and attributes, so </p><p class=MsoNormal>> trying to create unique keys for each repeated element and attribute </p><p class=MsoNormal>> doesn't seem meaningful or round-trippable.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> Mailing list discussion seems to be the best way to proceed, there are </p><p class=MsoNormal>> a lot of expert programmers there.</p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> On 2/20/2015 6:08 PM, John Carlson wrote:</p><p class=MsoNormal>>> I found this.  It has been discussed at length. </p><p class=MsoNormal>>> https://esdiscuss.org/topic/json-duplicate-keys</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>> On Fri, Feb 20, 2015 at 7:18 PM, John Carlson <yottzumm@gmail.com </p><p class=MsoNormal>>> <mailto:yottzumm@gmail.com>> wrote:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     And whee, node.js reports nothing.  So basically Don, if you </p><p class=MsoNormal>>> leave the duplicated JSON object name in, you will be tossing all </p><p class=MsoNormal>>> your JavaScript programmers which use standard utilities in node.js </p><p class=MsoNormal>>> into a black hole.  Here's the final code for node.  I will test in a </p><p class=MsoNormal>>> browser next:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     "use strict";</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     var content = '';</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     process.stdin.resume();</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     process.stdin.on('data', function(buf) { content += </p><p class=MsoNormal>>> buf.toString(); });</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     process.stdin.on('end', function() {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     try {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     console.log(JSON.stringify(JSON.parse(content), null, " "));</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     } catch (e) {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     console.log(e);</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     }</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     });</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>     On Fri, Feb 20, 2015 at 7:05 PM, John Carlson <yottzumm@gmail.com </p><p class=MsoNormal>>> <mailto:yottzumm@gmail.com>> wrote:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>         Okay, I figured it out.   JavaScript silently ignores </p><p class=MsoNormal>>> duplicate keys unless use strict is used.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>         "use strict";</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>         try {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>              var json = {"name":"n","name":"v"};</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>              console.log(json);</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>         } catch (e) {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>         console.log(e);</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>         }</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>         On Fri, Feb 20, 2015 at 6:23 PM, John Carlson </p><p class=MsoNormal>>> <yottzumm@gmail.com <mailto:yottzumm@gmail.com>> wrote:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             Here is a very simple test case.  I am posting to </p><p class=MsoNormal>>> stackoverflow.  I hope I don't get voted down.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             try {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             var json = '{"name":"n","name":"v"}';</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             console.log(json);</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             var jsonout = JSON.stringify(JSON.parse(json));</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             console.log(jsonout);</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             } catch (e) {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             console.log(e);</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             }</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>             On Fri, Feb 20, 2015 at 6:22 PM, John Carlson </p><p class=MsoNormal>>> <yottzumm@gmail.com <mailto:yottzumm@gmail.com>> wrote:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 I just found out that JSON.parse dies silently. </p><p class=MsoNormal>>> Here's better code, that still succeeds and removes a Transform.  I </p><p class=MsoNormal>>> think this is either a problem with the standard, or a problem with </p><p class=MsoNormal>>> JSON.stringify or JSON.parse in node.js, or my code, but we better </p><p class=MsoNormal>>> fix one of them.  Anyone know the authors of node.js and could tap </p><p class=MsoNormal>>> into them for not complying with the standard? I'm not saying my code </p><p class=MsoNormal>>> is perfect.  Should I go to stackoverflow and ask them to fix my code?</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 // Java Style Sheet Language, implementation 2</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 var content = '';</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 // read content into buffer</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 process.stdin.resume();</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 process.stdin.on('data', function(buf) { content += </p><p class=MsoNormal>>> buf.toString(); });</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 process.stdin.on('end', function() {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 try {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 console.log(JSON.stringify(JSON.parse(content), null, </p><p class=MsoNormal>>> " "));</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 } catch (e) {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 console.log(e);</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 }</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 });</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 Here's an example of running my code with a very </p><p class=MsoNormal>>> simple example:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 $ cat simple.json</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 "name": "n",</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 "name": "v"</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 }</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 $ node ValidateJSON.js < simple.json</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                   "name": "v"</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 }</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                 On Fri, Feb 20, 2015 at 6:03 PM, John Carlson </p><p class=MsoNormal>>> <yottzumm@gmail.com <mailto:yottzumm@gmail.com>> wrote:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     Okay, here's the results!  Douglas, I am </p><p class=MsoNormal>>> including you, because JSON.parse or JSON.stringify in node.js </p><p class=MsoNormal>>> silently eliminate a whole lot of "JSON".</p><p class=MsoNormal>>>                     Or it could be my code.  Let's figure out which </p><p class=MsoNormal>>> it is.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     //////////////////////////////////</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     // ValidateJSON.js, which should be runnable in </p><p class=MsoNormal>>> any node.js (please point out any bugs):</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     var content = '';</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     // read content into buffer</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     process.stdin.resume();</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     process.stdin.on('data', function(buf) { content </p><p class=MsoNormal>>> += buf.toString(); });</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     process.stdin.on('end', function() {</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>> console.log(JSON.stringify(JSON.parse(content), null, " "));</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     });</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     //////////////////////////////////////////</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     // INPUT</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     http://coderextreme.net/x3d.json</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     // OUTPUT</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     http://coderextreme.net/roundtrip.json</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     ///////////////////////////////////////////</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     //  Running results</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     $ node ValidateJSON.js < x3d.json > roundtrip.json</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     $ grep Transform x3d.json</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                          "Transform": [</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                          "Transform": [</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     $ grep Transform roundtrip.json</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         "Transform": [</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     Where's the missing Transform?  Did my code eat </p><p class=MsoNormal>>> it?  Did JSON.parse eat it?  Did JSON.stringify eat it?  did </p><p class=MsoNormal>>> console.log eat it?</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                     On Fri, Feb 20, 2015 at 4:33 PM, Don Brutzman </p><p class=MsoNormal>>> <brutzman@nps.edu <mailto:brutzman@nps.edu>> wrote:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         As before, your insights are much </p><p class=MsoNormal>>> appreciated.  Thanks John.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         It is looking like there may be some </p><p class=MsoNormal>>> terminology mismatches?  That might be an important cause of </p><p class=MsoNormal>>> misunderstanding.  Hoping to get clearer.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         When talking about "name" values, please </p><p class=MsoNormal>>> clarify.  Are your referring to element and attribute names, or </p><p class=MsoNormal>>> DEF/USE ID/IDREF names?</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         In general, we have been trying to create a </p><p class=MsoNormal>>> JSON representation for X3D that is round-trippable with any other </p><p class=MsoNormal>>> encoding.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         Not a goal is to create something incorrect </p><p class=MsoNormal>>> or unusable.  This isn't a marketing activity.  So no need for a </p><p class=MsoNormal>>> BogusJSON or whatever, there is simply no need for something broken.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         The X3dToJson.xslt is trying to take an </p><p class=MsoNormal>>> XML-based .x3d scene and produce a usable JSON representation. If </p><p class=MsoNormal>>> information is lost, and the result can't be written back out as the </p><p class=MsoNormal>>> original scene, then an encoding fails the round-trip test.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         Multiple approaches exist for converting XML </p><p class=MsoNormal>>> to JSON.  Some were explored and compared on the earlier email </p><p class=MsoNormal>>> threads.  First one that pops up on today's search is</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>> http://www.utilities-online.__info/xmltojson/ </p><p class=MsoNormal>>> <http://www.utilities-online.info/xmltojson/></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         When given the HelloWorld.x3d scene, it </p><p class=MsoNormal>>> replies with</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         {</p><p class=MsoNormal>>>                            "X3D": {</p><p class=MsoNormal>>>                              "-profile": "Immersive",</p><p class=MsoNormal>>>                              "-version": "3.3",</p><p class=MsoNormal>>>                              "-xmlns:xsd": </p><p class=MsoNormal>>> "http://www.w3.org/2001/__XMLSchema-instance </p><p class=MsoNormal>>> <http://www.w3.org/2001/XMLSchema-instance>",</p><p class=MsoNormal>>>                              "-xsd:__noNamespaceSchemaLocation": " </p><p class=MsoNormal>>> http://www.web3d.org/__specifications/x3d-3.3.xsd </p><p class=MsoNormal>>> <http://www.web3d.org/specifications/x3d-3.3.xsd> ",</p><p class=MsoNormal>>>                              "head": {</p><p class=MsoNormal>>>                                "meta": [</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "title",</p><p class=MsoNormal>>>                                    "-content": "HelloWorld.x3d"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "description",</p><p class=MsoNormal>>>                                    "-content": "Simple X3D scene </p><p class=MsoNormal>>> example: Hello World!"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "created",</p><p class=MsoNormal>>>                                    "-content": "30 October 2000"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "modified",</p><p class=MsoNormal>>>                                    "-content": "23 November 2014"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "creator",</p><p class=MsoNormal>>>                                    "-content": "Don Brutzman"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "Image",</p><p class=MsoNormal>>>                                    "-content": "HelloWorld.tall.png"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> http://en.wikipedia.org/wiki/__Hello_world </p><p class=MsoNormal>>> <http://en.wikipedia.org/wiki/Hello_world> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> en.wikipedia.org/wiki/Hello#\ </p><p class=MsoNormal>>> <http://en.wikipedia.org/wiki/Hello#%5C>"__Hello,_World\"_computer___program </p><p class=MsoNormal>>> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> http://en.wikibooks.org/w/__index.php?title=Computer___Programming/Hello_world </p><p class=MsoNormal>>> <http://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world> </p><p class=MsoNormal>>> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> http://www.HelloWorldExample.__net <http://www.HelloWorldExample.net> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": " http://www.web3D.org "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> http://www.web3d.org/realtime-__3d/news/internationalization-__x3d </p><p class=MsoNormal>>> <http://www.web3d.org/realtime-3d/news/internationalization-x3d> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> http://www.web3d.org/x3d/__content/examples/HelloWorld.__x3d </p><p class=MsoNormal>>> <http://www.web3d.org/x3d/content/examples/HelloWorld.x3d> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> http://X3dGraphics.com/__examples/__X3dForAdvancedModeling/__HelloWorldScenes </p><p class=MsoNormal>>> <http://X3dGraphics.com/examples/X3dForAdvancedModeling/HelloWorldScenes> </p><p class=MsoNormal>>> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "identifier",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> http://X3dGraphics.com/__examples/X3dForWebAuthors/__Chapter01-TechnicalOverview/__HelloWorld.x3d </p><p class=MsoNormal>>> <http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter01-TechnicalOverview/HelloWorld.x3d> </p><p class=MsoNormal>>> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "license",</p><p class=MsoNormal>>>                                    "-content": " </p><p class=MsoNormal>>> http://www.web3d.org/x3d/__content/examples/license.html </p><p class=MsoNormal>>> <http://www.web3d.org/x3d/content/examples/license.html> "</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "generator",</p><p class=MsoNormal>>>                                    "-content": "X3D-Edit 3.3, </p><p class=MsoNormal>>> https://savage.nps.edu/X3D-__Edit <https://savage.nps.edu/X3D-Edit>"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": "HelloWorld.wrl"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": "HelloWorld.x3dv"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": "HelloWorld.x3db"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": "HelloWorld.xhtml"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  {</p><p class=MsoNormal>>>                                    "-name": "reference",</p><p class=MsoNormal>>>                                    "-content": "HelloWorld.json"</p><p class=MsoNormal>>>                                  }</p><p class=MsoNormal>>>                                ]</p><p class=MsoNormal>>>                              },</p><p class=MsoNormal>>>                              "Scene": {</p><p class=MsoNormal>>>                                "Group": {</p><p class=MsoNormal>>>                                  "Viewpoint": {</p><p class=MsoNormal>>>                                    "-DEF": "ViewUpClose",</p><p class=MsoNormal>>>                                    "-centerOfRotation": "0 -1 0",</p><p class=MsoNormal>>>                                    "-description": "Hello world!",</p><p class=MsoNormal>>>                                    "-position": "0 -1 7"</p><p class=MsoNormal>>>                                  },</p><p class=MsoNormal>>>                                  "Transform": [</p><p class=MsoNormal>>>                                    {</p><p class=MsoNormal>>>                                      "-rotation": "0 1 0 3",</p><p class=MsoNormal>>>                                      "Shape": {</p><p class=MsoNormal>>>                                        "Appearance": {</p><p class=MsoNormal>>>                                          "Material": {</p><p class=MsoNormal>>>                                            "-DEF": "MaterialLightBlue",</p><p class=MsoNormal>>>                                            "-diffuseColor": "0.1 0.5 1"</p><p class=MsoNormal>>>                                          },</p><p class=MsoNormal>>>                                          "ImageTexture": {</p><p class=MsoNormal>>>                                            "-DEF": </p><p class=MsoNormal>>> "ImageCloudlessEarth",</p><p class=MsoNormal>>>                                            "-url": " </p><p class=MsoNormal>>> \"earth-topo.png\" \"earth-topo.jpg\" \"earth-topo-small.gif\" </p><p class=MsoNormal>>> \"http://www.web3d.org/x3d/__content/examples/Basic/earth-__topo.png\ </p><p class=MsoNormal>>> <http://www.web3d.org/x3d/content/examples/Basic/earth-topo.png%5C>" </p><p class=MsoNormal>>> \"http://www.web3d.org/x3d/__content/examples/Basic/earth-__topo.jpg\ </p><p class=MsoNormal>>> <http://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg%5C>" </p><p class=MsoNormal>>> \"http://www.web3d.org/x3d/__content/examples/Basic/earth-__topo-small.gif\ </p><p class=MsoNormal>>> <http://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif%5C>" </p><p class=MsoNormal>>> "</p><p class=MsoNormal>>>                                          }</p><p class=MsoNormal>>>                                        }</p><p class=MsoNormal>>>                                      }</p><p class=MsoNormal>>>                                    },</p><p class=MsoNormal>>>                                    {</p><p class=MsoNormal>>>                                      "-translation": "0 -2 0",</p><p class=MsoNormal>>>                                      "Shape": {</p><p class=MsoNormal>>>                                        "Text": {</p><p class=MsoNormal>>>                                          "-DEF": "TextMessage",</p><p class=MsoNormal>>>                                          "-string": "\"Hello\" </p><p class=MsoNormal>>> \"world!\"",</p><p class=MsoNormal>>>                                          "FontStyle": { "-justify": </p><p class=MsoNormal>>> "\"MIDDLE\" \"MIDDLE\"" }</p><p class=MsoNormal>>>                                        },</p><p class=MsoNormal>>>                                        "Appearance": {</p><p class=MsoNormal>>>                                          "Material": { "-USE": </p><p class=MsoNormal>>> "MaterialLightBlue" }</p><p class=MsoNormal>>>                                        }</p><p class=MsoNormal>>>                                      }</p><p class=MsoNormal>>>                                    }</p><p class=MsoNormal>>>                                  ]</p><p class=MsoNormal>>>                                }</p><p class=MsoNormal>>>                              }</p><p class=MsoNormal>>>                            }</p><p class=MsoNormal>>>                         }</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         This varies from the current HelloWorld.json </p><p class=MsoNormal>>> by including X3D/head/meta* tags, using a different attribute prefix </p><p class=MsoNormal>>> (- vice @), and dropping comments and inclusion/exclusion of default </p><p class=MsoNormal>>> attribute values.</p><p class=MsoNormal>>> http://www.web3d.org/x3d/__content/examples/HelloWorld.__json </p><p class=MsoNormal>>> <http://www.web3d.org/x3d/content/examples/HelloWorld.json></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         So is the XML -> JSON conversion from </p><p class=MsoNormal>>> http://www.utilities-online.__info/xmltojson </p><p class=MsoNormal>>> <http://www.utilities-online.info/xmltojson> producing illegal JSON too?</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         Looking forward to continued scrutiny and </p><p class=MsoNormal>>> improved understanding.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         On 2/20/2015 11:15 AM, John Carlson wrote:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                          On Feb 19, 2015 12:21 AM, </p><p class=MsoNormal>>> "John Carlson" <yottzumm@gmail.com <mailto:yottzumm@gmail.com> </p><p class=MsoNormal>>> <mailto:yottzumm@gmail.com <mailto:yottzumm@gmail.com>> </p><p class=MsoNormal>>> <mailto:yottzumm@gmail.com <mailto:yottzumm@gmail.com> </p><p class=MsoNormal>>> <mailto:yottzumm@gmail.com <mailto:yottzumm@gmail.com>>>> wrote:</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                              How does the X3D JSON </p><p class=MsoNormal>>> encoding handle two Shapes or Transforms or Groups of the same type </p><p class=MsoNormal>>> at the same depth in the tree with the same parent? Do you modify the </p><p class=MsoNormal>>> tree structure significantly?  I'm not that familiar with the </p><p class=MsoNormal>>> schema.  I just know you're going to have to do something else in </p><p class=MsoNormal>>> JavaScript, even if your JSON parses and works.  You can't use the </p><p class=MsoNormal>>> JSON directly as Javascript.   JSON != JavaScript.  We desire a </p><p class=MsoNormal>>> *JavaScript* and JSON encoding.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                 This is a crucial point and I'm </p><p class=MsoNormal>>> really glad you are raising it.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                             You're right it's a crucial point. It's </p><p class=MsoNormal>>> so crucial I brought it up with Douglas Crockford.  He said the </p><p class=MsoNormal>>> standard did not need to be changed.  What's important is how the </p><p class=MsoNormal>>> standard is *used*.   Say I'm in Java, and I'm reading in a A JSON </p><p class=MsoNormal>>> object.  What happens if I see a name in and object twice?  What do I </p><p class=MsoNormal>>> do?  Do I instantly change my attribute to a list? How?  Must I use a </p><p class=MsoNormal>>> list for every single attribute because that's what is allowed by </p><p class=MsoNormal>>> JSON?  No, is the answer.  JSON doesn't specify a set of name/list </p><p class=MsoNormal>>> pairs, it specifies name/value pairs.  JSON objects are meant to be </p><p class=MsoNormal>>> associative arrays or struct or record as is mentioned in the </p><p class=MsoNormal>>> standard.  I asked Douglas to change the standard so names appeared </p><p class=MsoNormal>>> only once in an object.  He demurred.  The thing is, it's the *use* </p><p class=MsoNormal>>> that matters, and you're going to pull a lot of programmer's hair out </p><p class=MsoNormal>>> and stick their fingers in electrical sockets if you continue to use </p><p class=MsoNormal>>> names more than once in a JSON object.  It</p><p class=MsoNormal>>>                             violates the spirit of the</p><p class=MsoNormal>>>                             standard if not the letter.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                 If we think about use cases for </p><p class=MsoNormal>>> Javascript applications loading X3D models, I think they are most </p><p class=MsoNormal>>> interested in reusing geometry for their own nefarious/magnificent </p><p class=MsoNormal>>> purposes.  Javascript programmers are likely less interested in X3D </p><p class=MsoNormal>>> event models, Scripts, protos and whatnot.  Library loaders might </p><p class=MsoNormal>>> convert such things to match their paradigm, or might also ignore </p><p class=MsoNormal>>> non-geometry nodes completely.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                             I guess what matters ultimately is that </p><p class=MsoNormal>>> JSON parsers must reject names appearing in objects more that once.  </p><p class=MsoNormal>>> Also, please do not call your encoding JSON because it</p><p class=MsoNormal>>>                             just *isn't*.  If we must, programmers </p><p class=MsoNormal>>> will move away from your JSON encoding, and use their own, as I have </p><p class=MsoNormal>>> already done.  All I'm actually doing is to asking you to make an X3D </p><p class=MsoNormal>>> JSON standard which makes good sense, and if not, don't call it </p><p class=MsoNormal>>> JSON.  FJSON or Fake JSON might be more appropriate.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                 Rephrase, Let JSON be JSON (a subset </p><p class=MsoNormal>>> that is good for data objects) and Javascript be Javascript (a </p><p class=MsoNormal>>> full-blown programming language).</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                 Not trying to downplay or avoid </p><p class=MsoNormal>>> anything, just looking at what the most common uses of an X3D scene </p><p class=MsoNormal>>> encoded as JSON might be.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                 Such an idea actually brings us full </p><p class=MsoNormal>>> circle to the design premise of all the scene encodings (XML .x3d, </p><p class=MsoNormal>>> Classic VRML .x3dv, binary .x3db) which is to completely/compatibly </p><p class=MsoNormal>>> represent an X3D scene, period.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                 If we achieve that with JSON, making </p><p class=MsoNormal>>> common geometry constructs easy for programmers to access, then great </p><p class=MsoNormal>>> they will do so.  If we also try to tell them "For Advanced Graphics </p><p class=MsoNormal>>> Using X3D JSON You Must Program Your Javascript Application This Way" </p><p class=MsoNormal>>> they will laugh.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                                 Viva la difference, programming </p><p class=MsoNormal>>> styles and practices will always vary and evolve.  Whatever works.</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                             Yes, whatever works.  Names or field </p><p class=MsoNormal>>> slots appearing in an object more than once in a struct or record </p><p class=MsoNormal>>> don't work in programmers' minds.  You will force every value to be a </p><p class=MsoNormal>>> list in their minds.  Which may be what you intend.  If so, then </p><p class=MsoNormal>>> explicitly do that in your JSON output (my restructuring in my </p><p class=MsoNormal>>> previous message).  Don't force the programmer into cognitive </p><p class=MsoNormal>>> overload.  Please only have names appearing once in your objects, I </p><p class=MsoNormal>>> beg you desperately, if you want your X3D JSON standard to be </p><p class=MsoNormal>>> relevant.  If not, then call it X3DON not *JS*ON</p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>>                         all the best, Don</p><p class=MsoNormal>>>                         --</p><p class=MsoNormal>>>                         Don Brutzman  Naval Postgraduate School, Code </p><p class=MsoNormal>>> USW/Br brutzman@nps.edu <mailto:brutzman@nps.edu></p><p class=MsoNormal>>>                         Watkins 270,  MOVES Institute, Monterey CA </p><p class=MsoNormal>>> 93943-5000 USA +1.831.656.2149 <tel:%2B1.831.656.2149></p><p class=MsoNormal>>>                         X3D graphics, virtual worlds, navy robotics </p><p class=MsoNormal>>> http://faculty.nps.edu/__brutzman <http://faculty.nps.edu/brutzman></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>><o:p> </o:p></p><p class=MsoNormal>> all the best, Don</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>