diff --git a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs index 27734c7f781..1dac4e25db3 100644 --- a/Flow.Launcher.Core/Plugin/JsonPRCModel.cs +++ b/Flow.Launcher.Core/Plugin/JsonPRCModel.cs @@ -13,6 +13,7 @@ * */ +using Flow.Launcher.Core.Resource; using System.Collections.Generic; using System.Linq; using System.Text.Json.Serialization; @@ -108,6 +109,7 @@ public class JsonRPCServerRequestModel : JsonRPCRequestModel /// public class JsonRPCClientRequestModel : JsonRPCRequestModel { + [JsonPropertyName("dontHideAfterAction")] public bool DontHideAfterAction { get; set; } } diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs index 11d1abb6328..875f4fb3ea1 100644 --- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs +++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs @@ -1,4 +1,5 @@ -using System; +using Flow.Launcher.Core.Resource; +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -45,13 +46,14 @@ public List LoadContextMenus(Result selectedResult) } } + private static readonly JsonSerializerOptions _options = new() {Converters = {new JsonObjectConverter()}}; private async Task> DeserializedResultAsync(Stream output) { if (output == Stream.Null) return null; - JsonRPCQueryResponseModel queryResponseModel = await - JsonSerializer.DeserializeAsync(output); + var queryResponseModel = await + JsonSerializer.DeserializeAsync(output, _options); return ParseResults(queryResponseModel); } @@ -60,11 +62,12 @@ private List DeserializedResult(string output) { if (string.IsNullOrEmpty(output)) return null; - JsonRPCQueryResponseModel queryResponseModel = - JsonSerializer.Deserialize(output); + var queryResponseModel = + JsonSerializer.Deserialize(output, _options); return ParseResults(queryResponseModel); } + private List ParseResults(JsonRPCQueryResponseModel queryResponseModel) { var results = new List(); @@ -85,7 +88,7 @@ private List ParseResults(JsonRPCQueryResponseModel queryResponseModel) { if (result.JsonRPCAction.Method.StartsWith("Flow.Launcher.")) { - ExecuteFlowLauncherAPI(result.JsonRPCAction.Method.Substring(4), + ExecuteFlowLauncherAPI(result.JsonRPCAction.Method[14..], result.JsonRPCAction.Parameters); } else diff --git a/Flow.Launcher.Core/Resource/JsonObjectConverter.cs b/Flow.Launcher.Core/Resource/JsonObjectConverter.cs new file mode 100644 index 00000000000..5a891ae3038 --- /dev/null +++ b/Flow.Launcher.Core/Resource/JsonObjectConverter.cs @@ -0,0 +1,42 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Flow.Launcher.Core.Resource +{ + public class JsonObjectConverter : JsonConverter + { + public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case JsonTokenType.True: + return true; + case JsonTokenType.False: + return false; + case JsonTokenType.Number when reader.TryGetInt32(out var i): + return i; + case JsonTokenType.Number when reader.TryGetInt64(out var l): + return l; + case JsonTokenType.Number: + return reader.GetDouble(); + case JsonTokenType.String when reader.TryGetDateTime(out DateTime datetime): + return datetime; + case JsonTokenType.String: + return reader.GetString(); + default: + // Use JsonElement as fallback. + // Newtonsoft uses JArray or JObject. + using (var document = JsonDocument.ParseValue(ref reader)) + { + return document.RootElement.Clone(); + } + } + } + + public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) + { + throw new InvalidOperationException("Should not get here."); + } + } +} \ No newline at end of file