JSON Sorting
(Redirected from Tutorials:Macros:JSONSortingFullCode)
Following is the full macro code for the Sorting Nested JSON Objects How To. Line numbers are excluded to ease cutting and pasting.
<!--Set Up Sample Object-->
[h:troll = json.set("{}", "name", "Troll", "HD", 4, "HP", 75)]
[h:orc = json.set("{}", "name", "Orc", "HD", 3, "HP", 13)]
[h:goblin = json.set("{}", "name", "Goblin", "HD", 2, "HP", 6)]
[h:gnoll = json.set("{}", "name", "Gnoll", "HD", 3, "HP", 19)]
[h:kobold=json.set("{}", "name", "Kobold", "HD", 1, "HP", 4)]
[h:monsters = json.set("{}", "Troll", troll, "Orc", orc, "Goblin",
goblin, "Gnoll", gnoll, "Kobold", kobold)]
<!--Request User Input for Sorting-->
[h:status = input(
"whichKey|name,HD,HP|Pick Sorting Key|LIST|SELECT=0 VALUE=STRING",
"whichDirection|A+,A-,N+,N-|Direction (A+/- for strings, N+/- for numbers!)"+
"|LIST|SELECT=0 VALUE=STRING"
)]
[h:abort(status)]
[h,if(substring(whichDirection,1)=="+"): dirString = "ascending"; dirString = "descending"]
<!--Initialize Variables-->
[h:sortObj=monsters]
[h:sortKey = whichKey]
[h:sortDirection = whichDirection]
[h:sortObjContentList = json.fields(sortObj)]
[h:keyList = ""]
[h:sortedJSON = "{}"]
<!--Get value corresponding to sortKey for each nested object and append to keyList-->
[h,foreach(item, sortObjContentList),CODE:
{
[h:itemDetail = json.get(sortObj,item)]
[h: keyList = listAppend(keyList, json.get(itemDetail, sortKey))]
}]
<!--Sort keyList based on the direction input by the user-->
[h:keyList = listSort(keyList, sortDirection)]
<!--
Loop through keyList, and for each element, find the matching nested object(s)
and add them to the new sortedJSON object
-->
[h,foreach(key,keyList),CODE:
{
[foreach(object,sortObj),CODE:
{
[objectDetail = json.get(sortObj,object)]
[h:sortOnValue = json.get(objectDetail, sortKey)]
[if(sortOnValue == key): sortedJSON=json.set(sortedJSON, object, objectDetail);""]
}]
}]
<!--Output the Results-->
JSON Object sorted by [r:whichKey], [r:dirString]:<br>
<pre>[r:json.indent(sortedJSON, 3)]</pre>