[x3d-public] [x3dom-users] simple X3D -> JSON -> X3DOM, D3.js

Michael Aratow maratow at noegenesis.com
Fri Feb 20 18:04:43 PST 2015


I think there is enough general interest and, as Don has surmised, 
communication mismatches, that a synchronous communication methodology 
(ie teleconference!!) be organized with the people who have provided 
such great comments and suggestions (eg John, Cecile, Don, Leonard, 
Johannes, Yvonne, Kristian and others).


On 2/20/15 2:33 PM, Don Brutzman wrote:
> As before, your insights are much appreciated.  Thanks John.
>
> It is looking like there may be some terminology mismatches?  That 
> might be an important cause of misunderstanding.  Hoping to get clearer.
>
> When talking about "name" values, please clarify.  Are your referring 
> to element and attribute names, or DEF/USE ID/IDREF names?
>
> In general, we have been trying to create a JSON representation for 
> X3D that is round-trippable with any other encoding.
>
> Not a goal is to create something incorrect or unusable.  This isn't a 
> marketing activity.  So no need for a BogusJSON or whatever, there is 
> simply no need for something broken.
>
> The X3dToJson.xslt is trying to take an XML-based .x3d scene and 
> produce a usable JSON representation.  If information is lost, and the 
> result can't be written back out as the original scene, then an 
> encoding fails the round-trip test.
>
> Multiple approaches exist for converting XML to JSON.  Some were 
> explored and compared on the earlier email threads.  First one that 
> pops up on today's search is
>
>     http://www.utilities-online.info/xmltojson/
>
> When given the HelloWorld.x3d scene, it replies with
>
> {
>   "X3D": {
>     "-profile": "Immersive",
>     "-version": "3.3",
>     "-xmlns:xsd": "http://www.w3.org/2001/XMLSchema-instance",
>     "-xsd:noNamespaceSchemaLocation": " 
> http://www.web3d.org/specifications/x3d-3.3.xsd ",
>     "head": {
>       "meta": [
>         {
>           "-name": "title",
>           "-content": "HelloWorld.x3d"
>         },
>         {
>           "-name": "description",
>           "-content": "Simple X3D scene example: Hello World!"
>         },
>         {
>           "-name": "created",
>           "-content": "30 October 2000"
>         },
>         {
>           "-name": "modified",
>           "-content": "23 November 2014"
>         },
>         {
>           "-name": "creator",
>           "-content": "Don Brutzman"
>         },
>         {
>           "-name": "Image",
>           "-content": "HelloWorld.tall.png"
>         },
>         {
>           "-name": "reference",
>           "-content": " http://en.wikipedia.org/wiki/Hello_world "
>         },
>         {
>           "-name": "reference",
>           "-content": " 
> en.wikipedia.org/wiki/Hello#\"Hello,_World\"_computer_program "
>         },
>         {
>           "-name": "reference",
>           "-content": " 
> http://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world 
> "
>         },
>         {
>           "-name": "reference",
>           "-content": " http://www.HelloWorldExample.net "
>         },
>         {
>           "-name": "reference",
>           "-content": " http://www.web3D.org "
>         },
>         {
>           "-name": "reference",
>           "-content": " 
> http://www.web3d.org/realtime-3d/news/internationalization-x3d "
>         },
>         {
>           "-name": "reference",
>           "-content": " 
> http://www.web3d.org/x3d/content/examples/HelloWorld.x3d "
>         },
>         {
>           "-name": "reference",
>           "-content": " 
> http://X3dGraphics.com/examples/X3dForAdvancedModeling/HelloWorldScenes "
>         },
>         {
>           "-name": "identifier",
>           "-content": " 
> http://X3dGraphics.com/examples/X3dForWebAuthors/Chapter01-TechnicalOverview/HelloWorld.x3d 
> "
>         },
>         {
>           "-name": "license",
>           "-content": " 
> http://www.web3d.org/x3d/content/examples/license.html "
>         },
>         {
>           "-name": "generator",
>           "-content": "X3D-Edit 3.3, https://savage.nps.edu/X3D-Edit"
>         },
>         {
>           "-name": "reference",
>           "-content": "HelloWorld.wrl"
>         },
>         {
>           "-name": "reference",
>           "-content": "HelloWorld.x3dv"
>         },
>         {
>           "-name": "reference",
>           "-content": "HelloWorld.x3db"
>         },
>         {
>           "-name": "reference",
>           "-content": "HelloWorld.xhtml"
>         },
>         {
>           "-name": "reference",
>           "-content": "HelloWorld.json"
>         }
>       ]
>     },
>     "Scene": {
>       "Group": {
>         "Viewpoint": {
>           "-DEF": "ViewUpClose",
>           "-centerOfRotation": "0 -1 0",
>           "-description": "Hello world!",
>           "-position": "0 -1 7"
>         },
>         "Transform": [
>           {
>             "-rotation": "0 1 0 3",
>             "Shape": {
>               "Appearance": {
>                 "Material": {
>                   "-DEF": "MaterialLightBlue",
>                   "-diffuseColor": "0.1 0.5 1"
>                 },
>                 "ImageTexture": {
>                   "-DEF": "ImageCloudlessEarth",
>                   "-url": " \"earth-topo.png\" \"earth-topo.jpg\" 
> \"earth-topo-small.gif\" 
> \"http://www.web3d.org/x3d/content/examples/Basic/earth-topo.png\" 
> \"http://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg\" 
> \"http://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif\" 
> "
>                 }
>               }
>             }
>           },
>           {
>             "-translation": "0 -2 0",
>             "Shape": {
>               "Text": {
>                 "-DEF": "TextMessage",
>                 "-string": "\"Hello\" \"world!\"",
>                 "FontStyle": { "-justify": "\"MIDDLE\" \"MIDDLE\"" }
>               },
>               "Appearance": {
>                 "Material": { "-USE": "MaterialLightBlue" }
>               }
>             }
>           }
>         ]
>       }
>     }
>   }
> }
>
> This varies from the current HelloWorld.json by including 
> X3D/head/meta* tags, using a different attribute prefix (- vice @), 
> and dropping comments and inclusion/exclusion of default attribute 
> values.
> http://www.web3d.org/x3d/content/examples/HelloWorld.json
>
> So is the XML -> JSON conversion from 
> http://www.utilities-online.info/xmltojson producing illegal JSON too?
>
> Looking forward to continued scrutiny and improved understanding.
>
>
> On 2/20/2015 11:15 AM, John Carlson wrote:
>>
>>>>     On Feb 19, 2015 12:21 AM, "John Carlson" <yottzumm at gmail.com 
>>>> <mailto:yottzumm at gmail.com> <mailto:yottzumm at gmail.com 
>>>> <mailto:yottzumm at gmail.com>>> wrote:
>>>>
>>>>         How does the X3D JSON encoding handle two Shapes or 
>>>> Transforms or Groups of the same type at the same depth in the tree 
>>>> with the same parent?  Do you modify the tree structure 
>>>> significantly?  I'm not that familiar with the schema.  I just know 
>>>> you're going to have to do something else in JavaScript, even if 
>>>> your JSON parses and works.  You can't use the JSON directly as 
>>>> Javascript.   JSON  != JavaScript.  We desire a *JavaScript* and 
>>>> JSON encoding.
>>>
>>>
>>> This is a crucial point and I'm really glad you are raising it.
>>
>> You're right it's a crucial point.  It's so crucial I brought it up 
>> with Douglas Crockford.  He said the standard did not need to be 
>> changed.  What's important is how the standard is *used*. Say I'm in 
>> Java, and I'm reading in a A JSON object.  What happens if I see a 
>> name in and object twice?  What do I do?  Do I instantly change my 
>> attribute to a list? How?  Must I use a list for every single 
>> attribute because that's what is allowed by JSON?  No, is the 
>> answer.  JSON doesn't specify a set of name/list pairs, it specifies 
>> name/value pairs.  JSON objects are meant to be associative arrays or 
>> struct or record as is mentioned in the standard.  I asked Douglas to 
>> change the standard so names appeared only once in an object.  He 
>> demurred.  The thing is, it's the *use* that matters, and you're 
>> going to pull a lot of programmer's hair out and stick their fingers 
>> in electrical sockets if you continue to use names more than once in 
>> a JSON object.  It violates the spirit of the
>> standard if not the letter.
>>
>>> If we think about use cases for Javascript applications loading X3D 
>>> models, I think they are most interested in reusing geometry for 
>>> their own nefarious/magnificent purposes.  Javascript programmers 
>>> are likely less interested in X3D event models, Scripts, protos and 
>>> whatnot.  Library loaders might convert such things to match their 
>>> paradigm, or might also ignore non-geometry nodes completely.
>>
>> I guess what matters ultimately is that JSON parsers must reject 
>> names appearing in objects more that once.  Also, please do not call 
>> your encoding JSON because it
>> just *isn't*.  If we must, programmers will move away from your JSON 
>> encoding, and use their own, as I have already done.  All I'm 
>> actually doing is to asking you to make an X3D JSON standard which 
>> makes good sense, and if not, don't call it JSON.  FJSON or Fake JSON 
>> might be more appropriate.
>>>
>>> Rephrase, Let JSON be JSON (a subset that is good for data objects) 
>>> and Javascript be Javascript (a full-blown programming language).
>>>
>>> Not trying to downplay or avoid anything, just looking at what the 
>>> most common uses of an X3D scene encoded as JSON might be.
>>>
>>> Such an idea actually brings us full circle to the design premise of 
>>> all the scene encodings (XML .x3d, Classic VRML .x3dv, binary .x3db) 
>>> which is to completely/compatibly represent an X3D scene, period.
>>>
>>> If we achieve that with JSON, making common geometry constructs easy 
>>> for programmers to access, then great they will do so.  If we also 
>>> try to tell them "For Advanced Graphics Using X3D JSON You Must 
>>> Program Your Javascript Application This Way" they will laugh.
>>>
>>> Viva la difference, programming styles and practices will always 
>>> vary and evolve.  Whatever works.
>>
>> Yes, whatever works.  Names or field slots appearing in an object 
>> more than once in a struct or record don't work in programmers' 
>> minds.  You will force every value to be a list in their minds.  
>> Which may be what you intend.  If so, then explicitly do that in your 
>> JSON output (my restructuring in my previous message).  Don't force 
>> the programmer into cognitive overload.  Please only have names 
>> appearing once in your objects, I beg you desperately, if you want 
>> your X3D JSON standard to be relevant.  If not, then call it X3DON 
>> not *JS*ON
>>
>
>
> all the best, Don




More information about the x3d-public mailing list