diff --git a/JsonViewer/Model/DeserializeResult.cs b/JsonViewer/Model/DeserializeResult.cs index 644fa5d..d403cdf 100644 --- a/JsonViewer/Model/DeserializeResult.cs +++ b/JsonViewer/Model/DeserializeResult.cs @@ -4,23 +4,23 @@ public class DeserializeResult { - private Dictionary _dictionary; + private SortedDictionary _dictionary; private string _preJsonText = string.Empty; private string _postJsonText = string.Empty; public DeserializeResult(Dictionary dictionary) { - _dictionary = dictionary; + _dictionary = new SortedDictionary(dictionary, new DictionaryComparer()); } public DeserializeResult(Dictionary dictionary, string preJsonText, string postJsonText) { - _dictionary = dictionary; + _dictionary = new SortedDictionary(dictionary, new DictionaryComparer()); _preJsonText = preJsonText; _postJsonText = postJsonText; } - public Dictionary Dictionary { get => _dictionary; } + public SortedDictionary Dictionary { get => _dictionary; } public string PreJsonText { get => _preJsonText; } @@ -28,15 +28,15 @@ public DeserializeResult(Dictionary dictionary, string preJsonTe public bool HasExtraText { get => !string.IsNullOrEmpty(this.PreJsonText) || !string.IsNullOrEmpty(this.PostJsonText); } - public Dictionary GetEverythingDictionary() + public SortedDictionary GetEverythingDictionary() { - Dictionary dict = this.Dictionary; + SortedDictionary dict = this.Dictionary; if (this.HasExtraText) { - dict = new Dictionary(); + dict = new SortedDictionary(new DictionaryComparer()); if (!string.IsNullOrEmpty(this.PreJsonText)) { - dict["Pre-JSON text"] = this.PreJsonText; + dict[DictionaryComparer.PreJsonKey] = this.PreJsonText; } foreach (string key in this.Dictionary.Keys) @@ -46,7 +46,7 @@ public Dictionary GetEverythingDictionary() if (!string.IsNullOrEmpty(this.PostJsonText)) { - dict["Post-JSON text"] = this.PostJsonText; + dict[DictionaryComparer.PostJsonKey] = this.PostJsonText; } } @@ -54,11 +54,39 @@ public Dictionary GetEverythingDictionary() } } -#pragma warning disable SA1402 // File may only contain a single class -#pragma warning disable SA1204 // Static elements must appear before instance elements - public static class DeserializeResultExtensions -#pragma warning restore SA1204 // Static elements must appear before instance elements -#pragma warning restore SA1402 // File may only contain a single class + internal class DictionaryComparer : IComparer + { + public const string PreJsonKey = "Pre-JSON text"; + public const string PostJsonKey = "Post-JSON text"; + + public int Compare(string x, string y) + { + if (x == y) + { + return 0; + } + + switch (x) + { + case PreJsonKey: + return -1; + case PostJsonKey: + return 1; + } + + switch (y) + { + case PreJsonKey: + return 1; + case PostJsonKey: + return -1; + } + + return x.CompareTo(y); + } + } + + internal static class DeserializeResultExtensions { public static bool IsSuccessful(this DeserializeResult deserializeResult) { diff --git a/JsonViewer/Model/JsonObject.cs b/JsonViewer/Model/JsonObject.cs index d550ba6..76b164e 100644 --- a/JsonViewer/Model/JsonObject.cs +++ b/JsonViewer/Model/JsonObject.cs @@ -292,7 +292,7 @@ public async Task TreatAsJson() DeserializeResult deserializeResult = await JsonObjectFactory.TryDeserialize(this.Value as string); FileLogger.Assert(deserializeResult != null); - Dictionary dict = deserializeResult.GetEverythingDictionary(); + SortedDictionary dict = deserializeResult.GetEverythingDictionary(); this.Value = dict; this.EnsureValues(); FileLogger.Assert(_dataType == DataType.Json); diff --git a/JsonViewer/Model/JsonObjectFactory.cs b/JsonViewer/Model/JsonObjectFactory.cs index 32254b9..d6bbdaf 100644 --- a/JsonViewer/Model/JsonObjectFactory.cs +++ b/JsonViewer/Model/JsonObjectFactory.cs @@ -196,7 +196,7 @@ public static Task TrySimpleDeserialize(string jsonString) }); } - public static void Flatten(ref List items, Dictionary dictionary, JsonObject parent) + public static void Flatten(ref List items, SortedDictionary dictionary, JsonObject parent) { List children = new List(); foreach (string key in dictionary.Keys) @@ -213,13 +213,17 @@ public static void Flatten(ref List items, Dictionary) + if (rawObject is SortedDictionary sortedDictionary) { - Flatten(ref items, rawObject as Dictionary, data); + Flatten(ref items, sortedDictionary, data); } - else if (rawObject is System.Collections.ArrayList) + else if (rawObject is Dictionary unsortedDictionary) { - Flatten(ref items, rawObject as System.Collections.ArrayList, data); + Flatten(ref items, new SortedDictionary(unsortedDictionary, new DictionaryComparer()), data); + } + else if (rawObject is System.Collections.ArrayList arrayList) + { + Flatten(ref items, arrayList, data); } } } @@ -242,9 +246,9 @@ public static void Flatten(ref List items, System.Collections.ArrayL items.Add(data); } - if (rawObject is Dictionary) + if (rawObject is SortedDictionary) { - Flatten(ref items, rawObject as Dictionary, data); + Flatten(ref items, rawObject as SortedDictionary, data); } else if (rawObject is System.Collections.ArrayList) { diff --git a/JsonViewer/Model/RootObject.cs b/JsonViewer/Model/RootObject.cs index b4c49ea..d30f030 100644 --- a/JsonViewer/Model/RootObject.cs +++ b/JsonViewer/Model/RootObject.cs @@ -18,7 +18,7 @@ public RootObject() { } - public static async Task Create(Dictionary jsonObj) + public static async Task Create(SortedDictionary jsonObj) { if (jsonObj == null) { diff --git a/JsonViewer/View/MainWindow.xaml.cs b/JsonViewer/View/MainWindow.xaml.cs index 3b7a06b..cffbbe5 100644 --- a/JsonViewer/View/MainWindow.xaml.cs +++ b/JsonViewer/View/MainWindow.xaml.cs @@ -96,7 +96,7 @@ public Task ReloadAsync() }); } - public async Task ReloadAsync(Dictionary dictionary) + public async Task ReloadAsync(SortedDictionary dictionary) { RootObject rootObject = await RootObject.Create(dictionary); if (rootObject == null) @@ -177,7 +177,7 @@ public async Task SetText(string newText) if (this._rawText != newText) { DeserializeResult deserializeResult = await JsonObjectFactory.TryAgressiveDeserialize(newText); - Dictionary dictionary = deserializeResult?.GetEverythingDictionary(); + SortedDictionary dictionary = deserializeResult?.GetEverythingDictionary(); string newNormalizedText = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(dictionary); if (newNormalizedText != _lastText) {