ZBLOG

System.Web.Extensions json转实体,实体转json

在 .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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8396

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?