【发布时间】:2020-07-26 17:15:18
【问题描述】:
我有在 ASP.NET Core 服务器和 Javascript 之间发送的这些数据结构。 数据以使用 websocket 消息序列化的 JSON 格式发送。
在本例中,对象有一个名为Text(大写T)的参数
Server(C# object) --> System.Text...JsonSerialize --> WebSocket --> JSON.parse --> JS object
最终的 JS 对象:
{
"Text": "Hello"
}
在引入 Blazor WebAssembly 之后,它使用 ClientWebSocket 直接与服务器对话
Server(C# object) --> System.Text...Serialize --> WebSocket --> System.Text...Deserialize --> C# object
问题,我的问题来自 JSInterop。
Blazor --> JSInterop --> JavaScript
最终的 JS 对象:
{
"text": "Hello"
}
现在Text 属性的名称text 全部小写。
如何配置对象序列化以保留 C# 对象的大小写?
解决方法
当前的解决方法是在通过 JSInterop 传递对象之前对其进行序列化,然后运行 JSON.parse 以取回对象。
C#
var jsonString = JsonSerializer.Serialize(arg)
JSRuntime.InvokeVoidAsync("MyFunction", jsonString);
JavaScript
window.MyFunction = function (jsonString) {
var arg = JSON.parse(jsonString)
....
}
【问题讨论】:
-
你能分享你的代码吗,不清楚你在问什么
-
@aguafrommars 问题是 C# 类的属性有大写字母,但是当它发送到 javascript 时,它是小写的。例如
class MyClass { public string Hey {get; set;} }将变成{ hey: '' }。字母大小写是Hey,但在js中变成hey。这就是你要问的 hultqvist 吗? -
这是
System.Text.Json的默认行为:请参阅 github.com/dotnet/aspnetcore/issues/12685 - 当我们转换为 .NET Core 时,我在 WebAPI 输出方面遇到了类似问题 - 我将序列化程序改回 NewtonSoft。可能有一种方法可以在Startup.cs中设置它,但我不知道你的上下文 -
我问的是外壳是正确的。我已经更新了问题。
-
@Quango 我正在使用 Blazor 客户端/webassembly。奇怪的是,我的解决方法也是使用
System.Text.Json,并且保留了外壳。
标签: blazor blazor-client-side blazor-jsinterop