【发布时间】:2019-05-31 03:33:52
【问题描述】:
我正在使用 Blazor javascript 互操作(js 调用 .NET),如
//js
dotNetObjRef.invokeMethodAsync("DotNetMethod", jsObject);
---------------------------------------------------------
//C#
[JSInvokable]
public void DotNetMethod(object jsObject)
{
Console.WriteLine($"jsObject type is {jsObject.GetType()}");
}
在浏览器控制台中,我得到:
'jsObject type is SimpleJson.JsonObject'
现在我想将 jsObject 转换为具体的 SimpleJson.JsonObject,如
[JSInvokable]
public void DotNetMethod(object jsObject)
{
JsonObject jsObject = (JsonObject)jsObject; //error
}
但我使用 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);
}
有谁知道是否可以(以及如何)直接使用接收到的 jsObject,即避免序列化/反序列化(并且没有反射)?
【问题讨论】:
-
通常 JSInterop 确实 要求您进行字符串序列化。事实上,您想以
JsonObject的形式与参数进行交互似乎意味着这正是您想要做的事情。所以我有点困惑,为什么您认为您的解决方法并不完全正确? -
Blazor 提供 JS 互操作,包括隐式转换 CLI JSON。如果我知道该类型的类签名,我可以在两个世界之间传递实例,并且 blazor 会自动转换它们。当我看到从 js 到 C# 的对象类型是 JsonObject 时,我希望我可以依赖 Blazor 的内置功能并简单地转换为 JsonObject 而不是手动序列化/反序列化它,但显然 Blazor 寻找一个强类型的目标。换句话说,如果我想要像 JsonObject 这样的弱类型表示,我必须明确。不过问题不大。
标签: javascript .net json interop blazor