C#使用JavaScriptSerializer反序列化JSON字符串

清欢
清欢
发布时间:2026-10-14| 2人浏览过
原创

在处理Web应用或API接口返回的数据时,JSON是常见的数据交换格式。本文将详细讲解如何在.NET环境中,通过内置的JavaScriptSerializer类,将一段复杂的JSON字符串高效、准确地转换为C#中的可操作对象,从而实现数据的结构化读取与分析。

结果与准备

目标是将类似如下的物流追踪信息JSON字符串解析为C#对象:

{
  "message":"ok",
  "nu":"9356359685",
  "state":"3",
  "data":[
    {
      "time":"2014-09-01 21:19:06",
      "context":"甘肃省武威市公司 已签收 ",
      "ftime":"2014-09-01 21:19:06"
    }
  ]
}

实现此功能无需引入第三方库,.NET Framework 提供了原生的支持类。核心依赖为 System.Web.Extensions 程序集中的 System.Web.Script.Serialization 命名空间。

真实操作顺序

第1步:构建匹配实体类结构

目的:建立JSON层级与C#类的映射关系,这是反序列化的基础。 原理:JavaScriptSerializer 默认通过反射匹配Public属性。属性名必须与JSON Key名称一致(不区分大小写),且数据类型需兼容(例如JSON的数字字符串可转为C#的String)。

动作:创建嵌套类模型。对于示例JSON,包含根节点和嵌套的数组项,需定义两个类:

  • PostalDeliveryModel:对应根节点,包含Message、Nu及Data列表。
  • SingalData:对应Data数组中的单个元素,包含Time、Context及FTime。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestJson
{
  // 外层类:对应JSON最外层的对象结构
  public class PostalDeliveryModel
  {
    private string message = string.Empty;
    private string nu = string.Empty;
    private List<SingalData> data = new List<SingalData>();

    // Public名字需与JSON Key保持一致(忽略大小写)
    public string Message 
    {
      get { return this.message; }
      set { this.message = value; }
    }

    public string Nu
    {
      get { return this.nu; }
      set { this.nu = value; }
    }

    public List<SingalData> Data
    {
      get { return this.data; }
      set { this.data = value; }
    }
  }

  // 内层类:对应JSON中数组元素的内部结构
  public class SingalData
  {
    private DateTime time = System.DateTime.Now;
    private string context = string.Empty;
    private DateTime ftime = System.DateTime.Now;

    public DateTime Time
    {
      get { return this.time; }
      set { this.time = value; }
    }

    public DateTime FTime
    {
      get { return this.ftime; }
      set { this.ftime = value; }
    }

    public string Context
    {
      get { return this.context; }
      set { this.context = value; }
    }
  }
}

第2步:加载JSON文本并执行反序列化

目的:将原始字符串流转化为上述定义的实例化对象。
入口:控制台应用程序或业务逻辑层。
重要参数:需确保引用了 System.Web.Script.Serialization 命名空间。

动作:读取文件(或网络响应流),实例化 JavaScriptSerializer 对象,调用泛型方法 Deserialize<T> 进行转换。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization; // 引用System.Web.Extensions框架

namespace TestJson
{
  public class Program
  {
    public static void Main(string[] args)
    {
      // 假设从文件中读取完整JSON字符串
      string jsonStr = new StreamReader("JsonData.txt").ReadToEnd();

      // 直接反序列化为指定的强类型对象
      PostalDeliveryModel mode = new JavaScriptSerializer().Deserialize<PostalDeliveryModel>(jsonStr);

      // 此时 mode.Data 中已包含转换好的物流记录列表
      Console.WriteLine(mode.Message); 
      Console.ReadKey();
    }
  }
}

完成判断与排错

完成状态:Console.ReadKey() 处设置断点,观察变量 mode。若展开 Data 集合能看到多条包含时间、上下文的对象数据,即表示解析成功。

注意事项与局限:
1. **字段映射限制**:原生 JavaScriptSerializer 要求C#属性名与JSON Key完全对应。若需自定义映射名称(如驼峰式到PascalCase),该方法不支持,通常需要使用特性标签(Attributes)或改用 Newtonsoft.Json (Json.NET) 等更灵活的库。
2. **日期格式处理**:虽然代码中将字段定义为 DateTime,但在实际开发中,某些复杂格式的JSON字符串可能需要配置序列化选项才能正确转换,否则可能抛出异常。

简要总结

以上就是C#中使用JavaScriptSerializer解析JSON字符串的详细步骤。该方法简单直接,适合轻量级且不涉及复杂字段映射的场景。更多关于C#数据处理的技术资料请关注本站其它相关文章!

相关标签:

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

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 算法库。