Implementing PHP’s KSORT in Dynamics NAV
This is just an undocumented snipped of my KSORT (php) implementation in C/AL using .NET. Maybe someone of you also has the requirement to implement this sorting algorithm. I had to use it in combination with a HMAC calculation for a REST request call. Yes, this doesn’t cover all functions KSORT offers, but it might lead one or the other to the right direction.
Sorts an array by key, maintaining key to data correlations. This is useful mainly for associative arrays.
PHP: ksort – Manual
LOCAL KSort(VAR JsonObject : DotNet "Newtonsoft.Json.Linq.JObject";SortNested : Boolean;IsResponseObject : Boolean)
//PHP's KSORT in Dynamics NAV
//Initialize sorted list
SortedList := SortedList.SortedList;
//Read unsorted json object
JSONMgt.InitializeObjectFromJObject(JsonObject);
//Add key/values to sorted list
IF JSONMgt.ReadProperties THEN
WHILE JSONMgt.GetNextProperty(Key, Value) DO BEGIN
SortedList.Add(Key, Value);
END;
//Reinitialize json object
JSONMgt.InitializeEmptyObject;
JSONMgt.GetJSONObject(JsonObject);
//Iterrate through properties
FOREACH KeyValue IN SortedList DO BEGIN
//Check and sort nested objects. In case object is a reponse json,
//we don't sort the nested objects, but format it using FormatCrefoJson().
//Using TryFunctions to determine object type, so care on debugging (errors will be shown)
IF SortNested THEN BEGIN
CASE TRUE OF
JSONMgt.TryParseJObjectFromString(TmpJObject[1], KeyValue.Value):
BEGIN
//Add object to json
IF IsResponseObject THEN
JSONMgt.AddJObjectToJObject(JsonObject, KeyValue.Key, FormatCrefoJson(TmpJObject[1].ToString))
ELSE BEGIN
//KSort nested object
KSort(TmpJObject[1], TRUE, IsResponseObject);
JSONMgt.AddJObjectToJObject(JsonObject, KeyValue.Key, TmpJObject[1]);
END;
END;
JSONMgt.TryParseJArrayFromString(TmpJArray[1], KeyValue.Value):
BEGIN
//Create new, sorted array
JSONMgt.InitializeEmptyCollection;
JSONMgt.GetJsonArray(TmpJArray[2]);
//Iterate objects in array
FOREACH TmpJObject[2] IN TmpJArray[1] DO BEGIN
//KSort nested object and add it to array
KSort(TmpJObject[2], TRUE, IsResponseObject);
JSONMgt.AddJObjectToJArray(TmpJArray[2], TmpJObject[2]);
END;
//Add array to base json object
JSONMgt.AddJArrayToJObject(JsonObject, KeyValue.Key, TmpJArray[2]);
END;
ELSE
JSONMgt.AddJPropertyToJObject(JsonObject, KeyValue.Key, KeyValue.Value);
END;
END ELSE
JSONMgt.AddJPropertyToJObject(JsonObject, KeyValue.Key, KeyValue.Value);
END;
Name | Type | Subtype |
JSONMgt | Codeunit | JSON Management |
Key | Text | |
Value | Text | |
KeyValue | DotNet | System.Collections.Generic.KeyValuePair`2 |
List | DotNet | System.Collections.Generic.List`1 |
SortedList | DotNet | System.Collections.SortedList |
Comparer | DotNet | System.Collections.IComparer |
TmpJObject | DotNet | Newtonsoft.Json.Linq.JObject |
TmpJArray | DotNet | Newtonsoft.Json.Linq.JArray. |
StringBuilder | DotNet | System.Text.StringBuilder |