C#反序列化JsTree生成的JSON时出现JsonSerializationException如何解决
错误核心原因
- 你拿到的JSON最外层是数组结构(以
[开头]包裹),但你尝试反序列化为单个JsTreeModel对象,类型不匹配触发序列化异常。 - 原有
JsTreeModel的属性类型定义错误:li_attr、a_attr、data都是JSON对象而非字符串,同时缺少树形结构必需的children子节点字段定义。
修正方案
第一步:调整实体类结构
// 对应li_attr字段的结构 public class LiAttr { [JsonProperty("id")] public string Id { get; set; } } // 对应a_attr字段的结构 public class AAttr { [JsonProperty("href")] public string Href { get; set; } [JsonProperty("id")] public string Id { get; set; } } // 修正后的JsTree节点模型 public class JsTreeModel { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("text")] public string Text { get; set; } // icon可能为布尔值或图标类名字符串,用object兼容两种场景 [JsonProperty("icon")] public object Icon { get; set; } [JsonProperty("li_attr")] public LiAttr LiAttr { get; set; } [JsonProperty("a_attr")] public AAttr AAttr { get; set; } // 自定义扩展data字段,无固定结构时用字典接收,有固定结构可替换为自定义类 [JsonProperty("data")] public Dictionary<string, object> Data { get; set; } // 子节点集合,递归嵌套自身类型实现树形结构 [JsonProperty("children")] public List<JsTreeModel> Children { get; set; } }
第二步:修改反序列化代码
因为外层是数组,所以要反序列化为List<JsTreeModel>类型:
List<JsTreeModel> treeNodes = Newtonsoft.Json.JsonConvert.DeserializeObject<List<JsTreeModel>>(json); // 如果确认仅存在一个根节点,可直接取集合第一个元素 JsTreeModel rootNode = treeNodes?.FirstOrDefault();
内容的提问来源于stack exchange,提问作者Eduardo Quezada
相关产品推荐
相关产品推荐

