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