C# 使用 JavaScriptSerializer 解析简单、嵌套及包含数组的 JSON
在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序列化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









