c# Newtonsoft 六个值得使用的特性(上)

C# Newtonsoft 六个值得使用的特性(上)

1. JsonProperty

public class User
{
    [JsonProperty("ID")]
    public int Id { get; set; }
    [JsonProperty("Name")]
    public string UserName { get; set; }
    [JsonProperty("IsAdmin")]
    public bool IsAdmin { get; set; }
}

JsonProperty 特性用于指定序列化和反序列化时 Json 对象中的属性名称。在上述示例中,JsonProperty("ID") 指定了 User 类型对象在序列化为 Json 对象时,Id 属性对应 Json 对象中的 "ID" key。反之,在反序列化时,“ID” key 会映射到 User 对象的 Id 属性。

2. JsonConverter

public class UserConverter : JsonConverter<User>
{
    public override User ReadJson(JsonReader reader, Type objectType, User existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        JObject obj = JObject.Load(reader);
        User user = new User();
        user.Id = (int)obj["UserID"];
        user.UserName = obj["Name"].ToString();
        user.IsAdmin = (bool)obj["IsAdmin"];
        return user;
    }

    public override void WriteJson(JsonWriter writer, User value, JsonSerializer serializer)
    {
        JObject obj = new JObject();
        obj["UserID"] = value.Id;
        obj["Name"] = value.UserName;
        obj["IsAdmin"] = value.IsAdmin;
        obj.WriteTo(writer);
    }
}

JsonConverter 特性可以实现对序列化和反序列化过程的细粒度控制(即在需要以不同的方式序列化和反序列化时,可以自定义转换逻辑)。上述示例演示了如何使用自定义的 UserConverter 类型实现 User 类型的序列化和反序列化过程。

3. JsonExtensionData

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public bool IsAdmin { get; set; }
    [JsonExtensionData]
    private IDictionary<string, JToken> _extraFields;

    public IDictionary<string, JToken> ExtraFields
    {
        get { return _extraFields; }
    }
}

JsonExtensionData 特性用于将 Json 对象中的未知属性序列化为键值对字典类型,并在 Json 反序列化时将其存储至注解对应的字段中。在上述示例中,未知属性将会被序列化成 ExtraFields 字段,在反序列化时 _extraFields 字段将会存储未定义的 Json 对象属性键与值的映射关系。

4. JsonConstructor

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public bool IsAdmin { get; set; }

    [JsonConstructor]
    public User(int id, string userName, bool isAdmin)
    {
        Id = id;
        UserName = userName;
        IsAdmin = isAdmin;
    }
}

JsonConstructor 特性用于指定反序列化时使用的构造函数。在上述示例中,首先定义了 User 类型默认的属性成员,接着指定了一个JsonConstructor 特性的构造函数,该构造函数被用于通过 Json 反序列化对象时的“构造过程”。

5. JsonIgnore

public class User
{
    public int Id { get; set; }

    [JsonIgnore]
    public string Password { get; set; }
}

JsonIgnore 特性用于配置在序列化对象时需要忽略的属性或字段。在上述示例中,Password 属性被标注 Ignored 不会被序列化为 Json 对象。

6. JsonSubtypes

[JsonConverter(typeof(JsonSubtypes), "type")]
[JsonSubtypes.KnownSubType(typeof(Circle), "circle")]
[JsonSubtypes.KnownSubType(typeof(Rectangle), "rectangle")]
public abstract class Shape
{
    public int X { get; set; }
    public int Y { get; set; }
}

public class Circle : Shape
{
    public int Radius { get; set; }
}

public class Rectangle : Shape
{
    public int Width { get; set; }
    public int Height { get; set; }
}

JsonSubtypes 特性用于在序列化或反序列化对象时实现基于类型的动态类型判断。在上述示例中,JsonSubtypes(KnownSubType...) 的约束指定在“type”属性(即 Json 对象中“type”所属的键),当值为“circle”时,反序列化成 Circle 类型对象,反之,反序列化成 Rectangle 类型对象。

下面给出一个完整的示例,如何将一个待序列化成 Json 对象的 User 类型对象中的名字 UserName 以“Hello, ”前缀的格式序列化。

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public bool IsAdmin { get; set; }

    public User(int id, string userName, bool isAdmin)
    {
        Id = id;
        UserName = userName;
        IsAdmin = isAdmin;
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        var user = new User(1, "Tom", false);
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CustomContractResolver()
        };
        Console.WriteLine(JsonConvert.SerializeObject(user, settings));
    }

    private class CustomContractResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var property = base.CreateProperty(member, memberSerialization);
            if (property.PropertyName == "UserName")
            {
                property.ValueProvider = new PrefixedValueProvider();
            }
            return property;
        }
    }

    private class PrefixedValueProvider : IValueProvider
    {
        public object GetValue(object target)
        {
            return "Hello, " + target.GetType().GetProperty("UserName").GetValue(target);
        }

        public void SetValue(object target, object value)
        {
            target.GetType().GetProperty("UserName").SetValue(target, value);
        }
    }
}

在示例中,自定义实现了 ContractResolver 策略,并在“UserName”属性对应的属性值的读和写操作过程进行了操作。最终,在序列化的过程中,UserName 属性值的前缀被更改为“Hello, ”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# Newtonsoft 六个值得使用的特性(上) - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#从数据库读取数据到DataSet并保存到xml文件的方法

    下面是详细讲解“C#从数据库读取数据到DataSet并保存到xml文件的方法”的完整攻略: 步骤1:连接数据库并读取数据 首先,需要在代码中连接数据库,从中读取数据,并将其存储在内存中的 DataSet 中。可以使用 SqlConnection 和 SqlDataAdapter 类来实现这个步骤。下面是一个示例代码: string connectionStr…

    C# 2023年5月31日
    00
  • C#实现简单屏幕监控的方法

    当我们需要监控并获取系统正在运行的一些信息时,屏幕监控便是一种非常有效的手段。在C#语言中,我们可以通过System.Windows.Forms这个库来实现简单的屏幕监控。 获取屏幕上的图像数据 第一步是获取屏幕上的图像数据。我们可以使用Screen类来获取当前屏幕的宽、高等参数,然后通过Graphics类的CopyFromScreen方法将屏幕上的图像数据…

    C# 2023年6月6日
    00
  • .NET 实现 JWT 登录验证

    .NET 实现JWT登录认证 在ASP.NET Core应用程序中,使用JWT进行身份验证和授权已成为一种流行的方式。JWT是一种安全的方式,用于在客户端和服务器之间传输用户信息。 添加NuGet包 首先,我们需要添加一些NuGet包来支持JWT身份验证。在您的ASP.NET Core项目中,打开Startup.cs文件,并在ConfigureService…

    C# 2023年4月22日
    00
  • C# 动态输出Dos命令执行结果的实例(附源码)

    下面是对主题“C# 动态输出Dos命令执行结果的实例(附源码)”的详细讲解攻略。 1. 背景介绍 在C#中执行DOS命令并输出执行结果,通常采用Process类来实现。但如果要及时输出命令执行结果,我们需要借助于StandardOutput和BeginOutputReadLine两个属性和方法。 2. 具体步骤 2.1 创建Process实例 首先,我们需要…

    C# 2023年6月7日
    00
  • C#如何删除指定文件或文件夹

    当我们需要在C#中删除指定的文件或文件夹时,可以使用.NET框架中的System.IO命名空间提供的相关类和方法来实现。 删除指定的文件 使用System.IO.File类的静态方法Delete()可以删除指定的文件,代码示例如下: using System.IO; string filePath = @"C:\test\test.txt&quot…

    C# 2023年6月1日
    00
  • C#简单遍历指定文件夹中所有文件的方法

    下面是“C#简单遍历指定文件夹中所有文件的方法”的完整攻略。 1. 使用Directory类 我们可以使用C#内置的Directory类来实现遍历指定文件夹中所有文件的功能。具体实现步骤如下: 引用System.IO命名空间,使用Directory.GetFiles()方法获取指定文件夹中所有文件的路径。 使用foreach循环遍历获取到的文件路径,在循环体…

    C# 2023年6月1日
    00
  • 使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

    在一些字典绑定中,往往为了方便展示详细数据,需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中,为了快速的处理数据的绑定操作,比较每次使用涉及太多细节的操作,我们可以把相关的数据绑定操作,放在一些辅助类的扩展函数中进行处理,这样可以更方便的,更简洁的处理数据绑定操作,本篇随笔介绍TreeList…

    C# 2023年4月30日
    00
  • 深入理解C#序列化与反序列化的详解

    深入理解C#序列化与反序列化的详解 本文将详细介绍C#中的序列化和反序列化概念、原理和常见用法,帮助读者全面了解这一重要的语言特性。 什么是序列化和反序列化? 序列化(Serialization)是指将对象转换成二进制流(byte array),以便能够在网络上传输、存储到文件或数据库等场合使用。反序列化(Deserialization)则是将二进制流还原为…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部