C# 使用 JavaScriptSerializer 解析简单、嵌套及包含数组的 JSON

方予
方予
发布时间:2026-10-15| 4人浏览过
原创

在C#开发中,处理API返回的JSON数据是常见需求。本文通过三个由易到难的实例,演示如何利用 System.Web.Script.Serialization 命名空间下的 JavaScriptSerializer 类,分别处理简单JSON、包含嵌套对象的JSON以及同时包含数组和对象的JSON数据。核心在于定义与JSON结构匹配的C#结构体(struct),并通过 Deserialize 方法完成转换。

处理简单的JSON数据

目标:解析仅包含基本键值对的扁平化JSON字符串。

第1步:准备测试JSON数据

假设存在如下JSON内容,通常来源于接口或文本文件:

{"result":"0","res_info":"ok","queryorder_info":"info"}

为了方便读取,可以将上述内容保存为 D:\json\jsonmy1.txt。在实际项目中,这通常是HTTP请求返回的字符串流。

第2步:构建C#结构体映射

为了将JSON转换为C#对象,需要创建一个结构与JSON字段一一对应的结构体。注意:结构体中的属性名称必须与JSON中的Key严格一致(大小写敏感)。

public struct ToJsonMy
{
    public string result { get; set; }
    public string res_info { get; set; }
    public string queryorder_info { get; set; }
}

第3步:执行反序列化操作

使用 JavaScriptSerializer 类的 Deserialize<T> 方法将JSON字符串转换为定义的 ToJsonMy 对象。

public static void JsonMy()
{
    // 1. 获取JSON字符串,实际业务中通常为 API 响应结果
    string json = Jsonstr("D:\\json\\jsonmy1.txt");
    
    // 2. 实例化序列化器
    JavaScriptSerializer js = new JavaScriptSerializer();
    
    // 3. 反序列化:将JSON转为 C# 对象
    ToJsonMy list = js.Deserialize<ToJsonMy>(json);
    
    // 4. 获取解析后的数据
    string result = list.result;
    string res_info = list.res_info;
    string queryorder_info = list.queryorder_info;
}

至此,简单JSON已成功解析,各字段值可通过对象属性直接访问。

处理包含嵌套对象的JSON数据

目标:解析包含内部子对象(Object within Object)的JSON结构。

第1步:分析嵌套JSON结构

以下JSON中,queryorder_info 不再是字符串,而是一个包含 order_num 和 orderdetail 的对象:

{"result":"0","res_info":"ok","queryorder_info":{"order_num":"5","orderdetail":"ok"}}

第2步:构建层级结构体

对于嵌套部分,需要单独定义一个结构体表示子对象,并在父结构体中引用它。

public struct ToJsonMy2
{
    public string result { get; set; }
    public string res_info { get; set; }
    public queryorder_info queryorder_info; // 引用子结构体
}

// 定义嵌套对象的结构
public struct queryorder_info
{
    public string order_num { get; set; }
    public string orderdetail { get; set; }
}

第3步:执行反序列化并取值

反序列化过程与简单JSON相同,但在访问深层数据时,需通过链式属性访问。

public static void JsonMy2()
{
    string json = Jsonstr("D:\\json\\jsonmy2.txt");
    JavaScriptSerializer js = new JavaScriptSerializer();
    
    // 反序列化
    ToJsonMy2 list = js.Deserialize<ToJsonMy2>(json);
    
    // 直接访问外层属性
    string result = list.result;
    string res_info = list.res_info;
    
    // 通过点运算符访问内层属性
    string order_num = list.queryorder_info.order_num;
    string orderdetail = list.queryorder_info.orderdetail;
}

处理包含对象和数组的JSON数据

目标:解析最复杂的场景,其中嵌套对象内部包含数组(Array of Objects)。

第1步:分析含数组的JSON

示例JSON中,queryorder_info 内的 orderdetail 是一个包含多个订单详情的数组:

{
  "result":"0",
  "res_info":"ok",
  "queryorder_info":{
    "order_num":"5",
    "orderdetail":[
      {"CFTUin":"769839263",...},
      {"CFTUin":"248486133",...}
    ]
  }
}

第2步:构建带List的结构体

在C#中,处理JSON数组需要使用泛型列表 List<T>。我们需要定义最底层的详情结构体,并在上层结构中用 List 接收它。

public struct ToJsonMy3
{
    public string result { get; set; }
    public string res_info { get; set; }
    public queryorder_info queryorder_info;
}

public struct queryorder_info
{
    public string order_num { get; set; }
    // 关键点:使用 List 来处理 JSON 中的数组 []
    public List<orderdetail> orderdetail;
}

// 定义数组中单个元素的结构
public struct orderdetail
{
    public string CFTUin { get; set; }
    public string CancelDeadline { get; set; }
    public string CheckInDate { get; set; }
    public string CheckOutDate { get; set; }
    public string CityID { get; set; }
    public string CurrencyCode { get; set; }
    public string HotelID { get; set; }
    public string HotelName { get; set; }
    public string ListID { get; set; }
    public string PayAmt { get; set; }
    public string PayType { get; set; }
    public string RommsCnt { get; set; }
    public string SPTransID { get; set; }
    public string State { get; set; }
}

第3步:遍历解析数组数据

反序列化后,可以通过索引器 [] 访问数组中的具体项。

public static void JsonMy4()
{
    string json = Jsonstr("D:\\json\\jsonmy4.txt");
    JavaScriptSerializer js = new JavaScriptSerializer();
    
    // 反序列化
    ToJsonMy3 list = js.Deserialize<ToJsonMy3>(json);
    
    string result = list.result;
    string res_info = list.res_info;
    string order_num = list.queryorder_info.order_num;
    
    // 获取数组集合
    List<orderdetail> orderdetailList = list.queryorder_info.orderdetail;
    
    // 访问数组第一个元素 (Index 0)
    if (orderdetailList.Count > 0) {
        string cftuFirst = orderdetailList[0].CFTUin;
        string hotelName = orderdetailList[0].HotelName;
    }
    
    // 访问数组第二个元素 (Index 1)
    if (orderdetailList.Count > 1) {
        string listIdSecond = orderdetailList[1].ListID;
    }
    
    // 访问数组第三个元素 (Index 2),需注意边界检查
    if (orderdetailList.Count > 2) {
        string stateThird = orderdetailList[2].State;
    }
}

总结与注意事项

  • 类型匹配:JavaScriptSerializer 自动处理常见的JSON类型到C#类型的映射(如 string, int, bool, DateTime等)。如果JSON中的数据格式与结构体属性类型不符(例如JSON数字对应C# String),可能会抛出异常或导致数据截断。
  • 空值处理:如果JSON中包含null值,而C#结构体属性为非Nullable类型(如普通的 int 而非 int?),在某些情况下可能引发问题,建议对可能的空字段使用可空类型或String存储。
  • 现代替代方案:虽然 JavaScriptSerializer 易于上手,但它已逐渐被废弃。在现代 .NET Core / .NET 5+ 项目中,官方推荐使用 System.Text.Json 或第三方的 Newtonsoft.Json (Json.NET),它们性能更好且功能更强大。

以上就是C#处理3种JSON数据的详细内容,更多关于C# JSON序列化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。