Fra*_*ron 5 .net javascript json interop blazor
我正在使用 Blazor javascript 互操作(js 调用 .NET),如下所示
//js
dotNetObjRef.invokeMethodAsync("DotNetMethod", jsObject);
---------------------------------------------------------
//C#
[JSInvokable]
public void DotNetMethod(object jsObject)
{
Console.WriteLine($"jsObject type is {jsObject.GetType()}");
}
Run Code Online (Sandbox Code Playgroud)
在浏览器控制台中,我得到:
'jsObject type is SimpleJson.JsonObject'
Run Code Online (Sandbox Code Playgroud)
现在我想将 jsObject 转换为具体的 SimpleJson.JsonObject,如下所示
[JSInvokable]
public void DotNetMethod(object jsObject)
{
JsonObject jsObject = (JsonObject)jsObject; //error
}
Run Code Online (Sandbox Code Playgroud)
但我使用 SimpleJson 的 C# 社区实现(如https://github.com/facebook-csharp-sdk/simple-json)的所有试验都失败,抱怨强制转换无效。
作为解决方法,我浏览字符串:
//js
dotNetObjRef.invokeMethodAsync("DotNetMethod", JSON.stringify(jsObject));
.
//C#
[JSInvokable]
public void DotNetMethod(string jsObjectJSON)
{
JsonObject jsObject = SimpleJson.DeserializeObject<JsonObject>(jsObjectJSON);
}
Run Code Online (Sandbox Code Playgroud)
有谁知道是否可以(以及如何)直接使用接收到的 jsObject,即避免序列化/反序列化(并且不进行反射)?
小智 5
为什么不接收先前定义的对象,而不是直接接收 JSON?
let x = {
"data": "test",
"moreData": "another test"
}
dotnetHelper.invokeMethodAsync('selectionChanged', x);
Run Code Online (Sandbox Code Playgroud)
进而
//C#
public class InteropHelper
{
public event Action OnSelectionChanged;
[JSInvokable]
public void selectionChanged(TestItem data)
{
OnSelectionChanged?.Invoke();
}
class TestItem
{
public string data { get; set; }
public string moreData { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
Blazor 会自动知道 JSON 中的哪些字段与 TestItem 中的哪些字段对应。