在 .NET Framework 中使用 System.Web.Extensions
进行 JSON 序列化和反序列化的方法:
1. 添加引用和命名空间
首先确保项目引用了 System.Web.Extensions
,然后添加命名空间:
using System.Web.Script.Serialization;
2. JSON 转实体(反序列化)
基本示例
// 定义实体类
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
// JSON字符串转实体
string jsonString = "{\"Name\":\"张三\",\"Age\":25,\"Email\":\"zhangsan@example.com\"}";
JavaScriptSerializer serializer = new JavaScriptSerializer();
Person person = serializer.Deserialize<Person>(jsonString);
Console.WriteLine($"姓名: {person.Name}");
Console.WriteLine($"年龄: {person.Age}");
Console.WriteLine($"邮箱: {person.Email}");
处理复杂对象
public class Address
{
public string City { get; set; }
public string Street { get; set; }
}
public class User
{
public string Name { get; set; }
public Address Address { get; set; }
public List<string> Hobbies { get; set; }
}
// JSON字符串
string json = @"
{
""Name"": ""李四"",
""Address"": {
""City"": ""北京"",
""Street"": ""长安街""
},
""Hobbies"": [""读书"", ""运动"", ""音乐""]
}";
JavaScriptSerializer serializer = new JavaScriptSerializer();
User user = serializer.Deserialize<User>(json);
Console.WriteLine($"用户名: {user.Name}");
Console.WriteLine($"城市: {user.Address.City}");
Console.WriteLine($"爱好数量: {user.Hobbies.Count}");
3. 实体转JSON(序列化)
基本序列化
Person person = new Person
{
Name = "王五",
Age = 30,
Email = "wangwu@example.com"
};
JavaScriptSerializer serializer = new JavaScriptSerializer();
string jsonResult = serializer.Serialize(person);
Console.WriteLine(jsonResult);
// 输出: {"Name":"王五","Age":30,"Email":"wangwu@example.com"}
处理集合对象
List<Person> people = new List<Person>
{
new Person { Name = "张三", Age = 25, Email = "zhangsan@example.com" },
new Person { Name = "李四", Age = 30, Email = "lisi@example.com" }
};
JavaScriptSerializer serializer = new JavaScriptSerializer();
string jsonArray = serializer.Serialize(people);
Console.WriteLine(jsonArray);
4. 自定义转换器(高级用法)
如果需要自定义序列化/反序列化过程,可以实现 JavaScriptConverter
:
public class CustomDateTimeConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get { return new[] { typeof(DateTime) }; }
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
DateTime dateTime = (DateTime)obj;
return new Dictionary<string, object>
{
["Value"] = dateTime.ToString("yyyy-MM-dd HH:mm:ss")
};
}
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
if (dictionary.TryGetValue("Value", out object value))
{
return DateTime.Parse(value.ToString());
}
return null;
}
}
// 使用自定义转换器
public class Event
{
public string Name { get; set; }
public DateTime EventTime { get; set; }
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new CustomDateTimeConverter() });
Event myEvent = new Event
{
Name = "会议",
EventTime = DateTime.Now
};
string jsonWithCustomDate = serializer.Serialize(myEvent);
Console.WriteLine(jsonWithCustomDate);
5. 错误处理和验证
public static T SafeDeserialize<T>(string json) where T : class, new()
{
try
{
if (string.IsNullOrEmpty(json))
return new T();
JavaScriptSerializer serializer = new JavaScriptSerializer();
// 设置最大JSON长度(可选)
// serializer.MaxJsonLength = int.MaxValue;
// 设置递归限制(可选)
// serializer.RecursionLimit = 100;
return serializer.Deserialize<T>(json);
}
catch (ArgumentException ex)
{
Console.WriteLine($"JSON格式错误: {ex.Message}");
return new T();
}catch (Exception ex)
{
Console.WriteLine($"反序列化失败: {ex.Message}");
return null;
}
}
// 使用安全的反序列化方法
string invalidJson = "{Invalid JSON}";
Person result = SafeDeserialize<Person>(invalidJson);
if (result != null)
{
Console.WriteLine("反序列化成功");
}
##6.处理特殊字符和编码
//处理包含特殊字符的JSON
string jsonWithSpecialChars ="{\"Name\":\"Tom&Jerry\",\"Description\":\"Contains & < > ' \\\" characters\"}";
JavaScriptSerializerserializer=newJavaScriptSerializer();
vardata=serializer.Deserialize<Dictionary<string,object>>(jsonWithSpecialChars);
Console.WriteLine(data["Name"]);//输出:Tom&Jerry
Console.WriteLine(data["Description"]);//输出:Contains&<>'"characters
##7.性能优化建议
对于大量数据的序列化/反序列化,可以考虑以下优化:
//重用JavaScriptSerializer实例(线程安全)
privatestaticreadonlyJavaScriptSerializerserializer=newJavaScriptSerializer();
publicstaticstringSerializeObject(objectobj)
{
returnserializer.Serialize(obj);
}
publicstaticTDeserializeObject<T>(stringjson)
{
returnserializer.Deserialize<T>(json);
}
#8.替代方案(推荐用于新项目)
虽然System.Web.Extensions
可用,但对于新项目建议使用更现代的方案:
-.NETCore/.NET5+:使用System.Text.Json
-.NETFramework4.5+:使用Newtonsoft.Json
(NuGet包)
##注意事项
1.安全性:避免反序列化来自不可信源的JSON数据
2.性能:对于大量数据,考虑使用更高效的JSON库
3.兼容性:System.Web.Extensions
主要用于.NETFramework项目
这种方法提供了在.NETFramework中使用内置JSON功能的基本方式。
内容由零声教学AI助手提供,问题来源于学员提问