<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>