JsonConvert.DeserializeObject解析外层封装JSON返回空对象问题
问题原因
你用于反序列化RadzenPanel的JSON结构多嵌套了一层根节点:实际JSON最外层是{"RadzenPanel": {实际属性内容}},但你定义的RadzenPanel类的属性直接是Id和RadzenUiElement,Newtonsoft.Json无法在JSON根节点找到对应属性,就会返回所有属性为默认值的对象,不会抛出异常。
解决方案
你可以任选以下任意一种方案解决:
方案1:修改JSON结构(最简便)
直接去掉外层的RadzenPanel包裹,将JSON调整为以下结构即可直接反序列化:
{"Id":"asfdgsertw34t43t34","RadzenUiElement":{/*原有UI元素内容*/}}
调整后原反序列化代码无需修改即可正常读取属性。
方案2:新增包裹类适配现有JSON
不需要修改JSON,新增一个根节点类即可:
public class RadzenPanelRoot { public RadzenPanel RadzenPanel { get; set; } }
反序列化代码修改为:
RadzenPanelRoot root = JsonConvert.DeserializeObject<RadzenPanelRoot>(RadzenPanel); RadzenPanel panels = root.RadzenPanel; // 后续可正常读取panels.Id等属性
方案3:用JObject提取内层节点再反序列化
不需要修改类结构也不需要修改JSON,用JObject预处理即可:
JObject jObj = JObject.Parse(RadzenPanel); RadzenPanel panels = jObj["RadzenPanel"].ToObject<RadzenPanel>();
后续支持数组的优化方案
如果后续需要RadzenPanel支持存储多个RadzenUIElement,只需要修改RadzenPanel类的定义即可:
public class RadzenPanel { public string Id { get; set; } // 单个元素改为数组/列表 public List<RadzenUIElement> RadzenUiElements { get; set; } }
调整JSON中对应字段为数组结构即可正常反序列化。
内容的提问来源于stack exchange,提问作者TunedBy
相关产品推荐
相关产品推荐

