37 lines
1.4 KiB
C#
37 lines
1.4 KiB
C#
|
|
using System.Diagnostics.CodeAnalysis;
|
|||
|
|
using System.Text.Json;
|
|||
|
|
using System.Text.Json.Nodes;
|
|||
|
|
using Jint;
|
|||
|
|
using Jint.Native;
|
|||
|
|
using Jint.Runtime.Interop;
|
|||
|
|
|
|||
|
|
namespace Elsa.Scripting.JavaScript.ObjectConverters;
|
|||
|
|
|
|||
|
|
internal class JsonElementConverter : IObjectConverter
|
|||
|
|
{
|
|||
|
|
public bool TryConvert(Engine engine, object value, [NotNullWhen(true)] out JsValue? result)
|
|||
|
|
{
|
|||
|
|
if (value is JsonElement jsonElement)
|
|||
|
|
{
|
|||
|
|
result = ConvertJsonElementToJsValue(engine, jsonElement);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
result = JsValue.Null;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static JsValue ConvertJsonElementToJsValue(Engine engine, JsonElement element) =>
|
|||
|
|
element.ValueKind switch
|
|||
|
|
{
|
|||
|
|
JsonValueKind.Object => JsValue.FromObject(engine, JsonObject.Create(element)),
|
|||
|
|
JsonValueKind.Array => JsValue.FromObject(engine, JsonArray.Create(element)),
|
|||
|
|
JsonValueKind.String => JsValue.FromObject(engine, element.GetString()),
|
|||
|
|
JsonValueKind.Number => element.TryGetInt32(out var intValue) ? JsNumber.Create(intValue) : JsNumber.Create(element.GetDouble()),
|
|||
|
|
JsonValueKind.True => JsBoolean.True,
|
|||
|
|
JsonValueKind.False => JsBoolean.False,
|
|||
|
|
JsonValueKind.Undefined => JsValue.Undefined,
|
|||
|
|
JsonValueKind.Null => JsValue.Null,
|
|||
|
|
_ => throw new InvalidOperationException($"Unsupported JsonValueKind: {element.ValueKind}")
|
|||
|
|
};
|
|||
|
|
}
|