Help with Nested Arrays - Json

Sannyasin Brahmanathaswami brahma at hindu.org
Mon Apr 18 19:03:04 EDT 2016


Disclaimer: I don’t know what I’m doing

I want to, as they say, in the UK, “come to grips” with nested arrays and then, secondarily, importing and exporting to and from JSON.

I have an actual use case in front of me. I could turn this over to one of the brainiacs on our team (Andre, David) but then I won’t learn anything.

So I come again with a begging bowl, asking in simple terms and then perhaps newbies lurking will also gain from this.

OK: I need to take a functional specification/screens mocked up on Indesign and turn it into a “map” that describes the cards and elements on the cards. These cards comprise a hero image at the top, and a series of small groups below which act as links/buttons. These links in turn form a big group that can be scrolled and used to trigger navigation to other cards/modules in the app.

I start simply by using Excel, filling in a table, export to tab-delimited data, the attempting to parse that data into a nested multi-level array.

This is a snippet, where the first column is the card, the second column is the group type, then we have the “params” related to each of the link/button/groups (label, background image path, system message type, target and orientation of the destination card.

home	hero-image	Portals to Saivite Hinduism	img/portal-heros/home-hero.jpg			
home	link	Gems of\nWisdom	img/portal-link-thumbs/home/home-gems_thm.jpg	goModuleStack	gems-module	portrait
home	link	Surprise\nMe	img/portal-link-thumbs/home/home-surprise_thm.jpg	goPortalCard	surprise-portal	portrait
home	link	Look	img/portal-link-thumbs/home/home-look_thm.jpg	goPortalCard	look-portal	portrait
home	link	Listen	img/portal-link-thumbs/home/home-listen_thm.jpg	goPortalCard	listen-portal	portrait
home	link	Read	img/portal-link-thumbs/home/home-read_thm.jpg	goPortalCard	read-portal	portrait
home	link	Practice	img/portal-link-thumbs/home/home-practice_thm.jpg	goPortalCard	practice-portal	portrait
home	link	Our\nWebsite	img/portal-link-thumbs/home/home-website_thm.jpg	goPortalCard	website-portal	portrait
home	link	Fun \n Games	img/portal-link-thumbs/home/home-fun_thm.jpg	goPortalCard	fun-portal	portrait	
surprise-portal	hero-image	Surprise Me	img/portal-heros/surprise-hero.jpg			
surprise-portal	link	Verses from\nthe Vedas	img/portal-link-thumbs/surprise-portal/vedas-verses_thm.jpg	fetchTextReader	http://www.himalayanacademy.com/sivasiva-api/random-vedas	portrait
surprise-portal	link	Tirukural\nCouplets	img/portal-link-thumbs/surprise-portal/tirukural-verses_thm.jpg	fetchTextReader	http://www.himalayanacademy.com/sivasiva-api/random-kural	portrait
surprise-portla	link	Inspired\nAudio Talks	img/portal-link-thumbs/surprise-portal/talks_thm.jpg	playAudio	http://www.himalayanacademy.com/sivasiva-api/random-talk	portrait
surprise-portal	link	Songs\nAnd Chants	img/portal-link-thumbs/surprise-portal/songs_thm.jpg	playAudio	http://www.himalayanacademy.com/sivasiva-api/random-some	portrait
surprise-portal	link	Sacred\nArt	img/portal-link-thumbs/surprise-portal/art_thm.jpg	displayImage	http://www.himalayanacademy.com/sivasiva-api/random-art	portrait
surprise-portal	link	Gurudeva's\nDarshan	img/portal-link-thumbs/surprise-portal/gurudeva_thm.jpg	displayImage	http://www.himalayanacademy.com/sivasiva-api/random-gurudeva	portrait
surprise-portal	link	Bodhinatha's\nDarshan	img/portal-link-thumbs/surprise-portal/bodhinatha_thm.jpg	displayImage	http://www.himalayanacademy.com/sivasiva-api/random-bodhinatha	portrait
surprise-portal	link	Video\nWorld	img/portal-link-thumbs/surprise-portal/video_thm.jpg	playVideo	http://www.himalayanacademy.com/sivasiva-api/random-video	landscape
surprise-portal	link	Five Inspired Quotes	img/portal-link-thumbs/surprise-portal/trilogy-quotes_thm.jpg	fetchTextReader	http://www.himalayanacademy.com/sivasiva-api/random-trilogy	portrait
read-portal	hero-image	Read, Learn, Study	img/portal-heros/read-hero.jpg			
read-portal	link	Frequently\nAsked\nQuestions	img/portal-link-thumbs/surprise-portal/faq_thm.jpg	goModuleStack	faq-module	portrait
read-portal	link	Gurudeva's\nSpiritual\nToolbox	img/portal-link-thumbs/surprise-portal/gr-toolbox_thm.jpg	goModuleStack	gr-toolbox-module	portrait
read-portal	link	All Our\nOn-Line\nBooks	img/portal-link-thumbs/surprise-portal/publications_thm.jpg	browseWeb	http://www.himalayanacademy.com/readlearn/books	landscape
read-portal	link	Lesson of\nthe Day	img/portal-link-thumbs/surprise-portal/daily-lesson_thm.jpg	browseWeb	http://www.himalayanacademy.com/livespiritually/become-student/todays-lesson	portrait
read-portal	link	Path to Siva:\nA Catechism\nfor Youth	img/portal-link-thumbs/surprise-portal/path-to-siva_thm.jpg	goModuleStack	path-to-siva-module	portrait
read-portal	link	A Character\nBuilding\nWorkbook	img/portal-link-thumbs/surprise-portal/character-building_thm.jpg	goModuleStack	character-building-module	portrait
read-portal	link	Educational\nInsights	img/portal-link-thumbs/surprise-portal/edu-insights_thm.jpg	browseWeb	http://www.himalayanacademy.com/site/search/file_id/_ei	portrait
read-portal	link	Hindu\nTimeline	img/portal-link-thumbs/surprise-portal/timeline_thm.jpg	browseWeb	 http://www.himalayanacademy.com/book/dancing-with-siva/527	portrait


Now I want to load this into a nested array and run JsonExport.  I go this far:

local tGroupCounter, aPortalLinks
on mouseUp 
   # clear the array
   put empty into aPortalLinks
   answer "Use Data Input path?" with "No" or "Yes"
   if it is "no" then
      answer file "Choose your tab delimited file" with "OK"
      put it into fld "dataInput"
   end if
   put url ("file:" & fld "dataInput") into tData
   set the itemdel to tab
   
   put "SivaSiva" into aPortalLinks["tStack"]
   put "0" into tGroupCounter
   
   repeat for each line x in tData
      put item 1 of x into aPortalLinks["stack"]["tCard"]
      put item 2 of x into tGroupType
      if tGroupType = "link" then
         add 1 to tGroupCounter
         put (tGroupType & tGroupCounter) into tGroupType
      end if
      put tGroupType into aPortalLinks["tStack"]["tCard"]["tGroup"]
      put item 3 of x into aPortalLinks["tStack"]["tCard"]["tGroup"]["label"]
      put item 4 of x into aPortalLinks["tStack"]["tCard"]["tGroup"]["imgPath"]
      put item 5 of x into aPortalLinks["tStack"]["tCard"]["tGroup"]["message"]
      put item 6 of x into aPortalLinks["tStack"]["tCard"]["tGroup"]["target"]
      put item 7 of x into aPortalLinks["tStack"]["tCard"]["tGroup"]["orientation"]
   end repeat
   put JsonExport(aPortalLinks)
end mouseUp 

If we exit the repeat loop entirely immediately  I get this output

{"tStack": "SivaSiva”}

If I let it run…  I get this output which is from the very last line in the data:

{
	"stack": {
	"tCard": "read-portal"
	},
	"tStack": {
		“	tCard": {
	"tGroup": {
		"imgPath": "img/portal-link-thumbs/surprise-portal/timeline_thm.jpg",
		"message": "browseWeb",
		"label": "Hindu\\nTimeline",
		"target": " http://www.himalayanacademy.com/book/dancing-with-siva/527",
		"orientation": "portrait"
		}
		}
	}
}

Instead of building up the array… somehow my method is wiping out that “higher dimensions” of the array. 
Leaving us with a single element instead of elements for each line of the inputData

This has nothing to do with the JsonExport library.. I can see this happening in the variable watcher before we ever get to the JsonExport function. Setting a break point at the top of the script and stepping in the debugger, the variable Watcher shows:

aPortalLinks
   tStack   —>   SivaSiva  # so far so good...
     

Then stepping to next line

aPortalLinks
   tStack >          # now empty? Why?
     tCard > home

Then stepping to next line

aPortalLinks
   tStack >  
      tCard >       # now empty? Why?
       	 tGroup > link1

Then stepping to next line

aPortalLinks
	tStack >
		tCard > 
			tGroup > # now empty? Why?
				imgPath > img/portal-link-thumbs/surprise-portal/timeline_thm.jpg
				Message >browseWeb
				Label > Hindu\\nTimeline
				Target > http://www.himalayanacademy.com/book/dancing-with-siva/527
				Orientation > portrait


And in the end… only the last line is output to Json, with the last iteration of params for the group intact.
  				
What am I doing wrong?

BR (8.0.0 RC1)

Secondary issue: we need to represent “CR” kin the input data… I used the \n  as prescribed by JSON rules… … but the JsonExport is escaping the backslash 

input:   firstLine\nSecondLine
output:  firstLine\\nSecondline

Anyway to avoid this? Because if we need to run a JsonIMport later… I think \\n will break it and not be interpreted correction as a new line - CR. (TBD) 


BR











More information about the use-livecode mailing list