C#使用JavaScriptSerializer反序列化深层JSON至自定义对象报错求助
JSON反序列化失败的原因及解决办法
你猜的没错!JSON层级不匹配确实是导致反序列化失败的核心原因,另外还有个容易忽略的细节:你用错了序列化特性的适配库。
咱们一步步拆解问题:
问题根源
结构层级不对应
你的JSON结构是嵌套的:{ "count": 2, "data" : { "items" : [ ... ] } }但你的
Messages类直接定义了itemCount和messages,完全没处理中间的data层——序列化器找不到对应data的属性,自然无法正确解析里面的items数组。序列化特性不兼容
你用了[JsonProperty("letterheadline")],但这个特性是**Newtonsoft.Json(Json.NET)**专属的,而你实际调用的是JavaScriptSerializer,它根本不认识这个特性,等于白加了。
解决方案
方案1:继续使用JavaScriptSerializer
需要补全类结构来匹配JSON的层级,同时改用JavaScriptSerializer支持的[DataContract]和[DataMember]特性:
using System.Runtime.Serialization; using System.Collections.Generic; using System; [DataContract] public class Message { [DataMember(Name = "letterheadline")] public string title { get; set; } [DataMember(Name = "message")] public string body { get; set; } [DataMember(Name = "dateEntered")] public DateTime entryDate { get; set; } } [DataContract] public class MessageData { [DataMember(Name = "items")] public List<Message> messages { get; set; } } [DataContract] public class Messages { [DataMember(Name = "count")] public int itemCount { get; set; } [DataMember(Name = "data")] public MessageData data { get; set; } }
反序列化后,要获取消息列表的话,需要通过messages.data.messages来访问。
方案2:改用更灵活的Newtonsoft.Json(推荐)
如果可以切换序列化库,Json.NET的兼容性和扩展性更好,而且能直接用你之前写的[JsonProperty]特性,只需要补全层级结构:
using Newtonsoft.Json; using System.Collections.Generic; using System; public class Message { [JsonProperty("letterheadline")] public string title { get; set; } [JsonProperty("message")] public string body { get; set; } [JsonProperty("dateEntered")] public DateTime entryDate { get; set; } } public class MessageData { [JsonProperty("items")] public List<Message> messages { get; set; } } public class Messages { [JsonProperty("count")] public int itemCount { get; set; } [JsonProperty("data")] public MessageData data { get; set; } }
然后替换反序列化代码:
Messages messages = JsonConvert.DeserializeObject<Messages>(result);
总结
- 你的核心猜测正确:必须新增对应
data层的属性来匹配JSON的嵌套结构; - 额外注意不同序列化库的特性不能混用,不然会出现特性无效的情况。
内容的提问来源于stack exchange,提问作者Phorce
相关产品推荐
相关产品推荐

