Blazor中JSInterop传入JSON反序列化不完整问题排查
可能的原因及解决方法
1. 自定义日期转换器的问题
- 确认
End属性是否同样标记了[JsonConverter(typeof(TZDateJsonConverter))],如果仅给Start添加转换器,End会因无法解析嵌套日期结构返回null。 - 检查
TZDateJsonConverter的Read方法逻辑:JS返回的start/end是含多层d结构的嵌套对象,转换器需要逐层解析d内的字段(如d.year/d.month),若逻辑只处理单层结构,会导致解析失败返回null。
2. JS对象转JSON字符串的方式错误
你在C#中调用eventBeingModified.ToString()大概率没得到有效JSON:JS对象直接调用toString()会返回[object Object],而非标准JSON字符串。正确做法是在JavaScript端先用JSON.stringify(eventBeingModified)将对象序列化为JSON字符串,再通过JSInterop传给C#,之后再执行反序列化。
3. TUIEvent类的属性定义问题
- 检查
End和IsVisible是否有public setter:比如public TZDate End { get; set; }、public bool IsVisible { get; set; }。若只有getter,JsonSerializer无法为属性赋值,会导致End为null、IsVisible保持默认值(false)。 - 确认属性类型匹配:如果JSON中
isVisible是字符串类型(如"true"/"false"),默认反序列化器不会自动转换,需添加自定义布尔转换器,或修改JS端传递原生布尔值。
4. 属性名称匹配问题
即使开启了PropertyNameCaseInsensitive=true,仍需确认JSON字段名与C#属性名拼写完全一致:
- 比如JSON中布尔字段是
visible而非isVisible,C#的IsVisible无法匹配; - 检查JSON中的
end字段是否存在且非null,若JS返回的end为undefined,反序列化后End会是null。
排查步骤建议
- 打印
eventBeingModified.ToString()的实际输出,确认是否为有效JSON,以及字段名、类型是否符合预期; - 单独测试
TZDateJsonConverter:构造包含end结构的JSON字符串,直接调用JsonSerializer.Deserialize<TZDate>(endJson, converter),验证转换器逻辑是否正确; - 暂时移除自定义转换器,用默认反序列化测试
End能否被解析为嵌套对象,排查是否为转换器导致的问题。
内容的提问来源于stack exchange,提问作者GisMofx
相关产品推荐
相关产品推荐

