C#使用JavaScriptSerializer反序列化JSON字符串
在处理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#数据处理的技术资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













