You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用JavaScriptSerializer反序列化深层JSON至自定义对象报错求助

JSON反序列化失败的原因及解决办法

你猜的没错!JSON层级不匹配确实是导致反序列化失败的核心原因,另外还有个容易忽略的细节:你用错了序列化特性的适配库。

咱们一步步拆解问题:

问题根源

  1. 结构层级不对应
    你的JSON结构是嵌套的:

    {
      "count": 2,
      "data" : {
        "items" : [ ... ]
      }
    }
    

    但你的Messages类直接定义了itemCount和messages,完全没处理中间的data层——序列化器找不到对应data的属性,自然无法正确解析里面的items数组。

  2. 序列化特性不兼容
    你用了[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:39:58