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#中的WebRequest与WebResponse抽象类、DNS静态类、Ping类介绍

    C#中的WebRequest与WebResponse抽象类、DNS静态类、Ping类介绍 1. WebRequest与WebResponse抽象类 WebRequest与WebResponse是C#中用于发送HTTP请求并获取HTTP响应的抽象类,它们的定义位于System.Net命名空间中。WebRequest对象表示一个HTTP请求的数据,并且可以使用W…

    C# 2023年6月6日
    00
  • jsp和asp.net共享session值示例代码

    当用户使用JSP应用程序访问ASP.NET应用程序时,需要在这两个应用程序之间共享sessions,这可以用以下两种方法实现:使用相同的session ID,使用数据库来持久化sessions。 下面是使用相同的session ID来共享跨平台sessions的示例代码: 首先,要在相应的服务器端设置session ID的cookie为Java Servle…

    C# 2023年5月31日
    00
  • WinForm中的几个实用技巧汇总

    当然!首先,我们需要明确一下,WinForm中有哪些实用技巧值得总结。我自己的经验和理解是:界面美化、控件操作和数据绑定方面的技巧。接下来,我会对这三个方面分别进行详细的说明。 界面美化 WinForm中的界面美化,通常包括以下几个方面的技巧: 1. 更换窗体边框 因为WinForm默认的边框比较丑陋,所以我们通常会使用其他美观的边框,比如圆角边框、图片边框…

    C# 2023年6月7日
    00
  • .NET基础面试题整理小结

    针对“.NET基础面试题整理小结”的攻略,我可以提供以下的完整过程和示例说明: 1. 确定文章的主旨和目标读者 首先需要明确,文章的主旨是整理.NET基础面试题,并对每个问题进行详细解答;目标读者是那些正在学习.NET编程或者准备参加.NET相关面试的人员。 2. 收集面试题库,按照分类整理 在整理.NET基础面试题时,需要先收集全面的面试题库,包括语言基础…

    C# 2023年6月6日
    00
  • ASP.NET设计网络硬盘之上传文件实现代码

    为了实现ASP.NET网络硬盘中的上传文件功能,我们需要使用ASP.NET框架中的文件上传组件HttpPostedFile和HttpWebRequest等相关类库实现。下面是一些基本的步骤: 步骤一:在ASP.NET网站中设置上传文件的目录 要上传文件,我们首先需要在ASP.NET网站中设置一个上传文件的目录。通常,我们会在网站的根目录下创建一个名为“Upl…

    C# 2023年5月31日
    00
  • C#线程间通信的异步机制

    C#线程间通信是一个常见的问题,当我们需要在多个线程间共享数据或者进行协作时,就需要使用线程间通信机制。异步机制是其中一种常用的通信方式,其可以有效避免线程阻塞的问题,并且能够方便地实现所需的功能。 本文将为大家详细讲解C#线程间通信的异步机制,包括异步编程模型(APM)、基于事件的异步编程模型(EAP)和基于任务的异步编程模型(TAP)。并且通过两个示例来…

    C# 2023年6月3日
    00
  • C#编写网游客户端的实现

    C#编写网游客户端的实现 在编写网游客户端时,我们需要基于C#开发。C#是一种由微软开发的通用、面向对象的编程语言,被广泛应用于Windows平台上的应用程序开发、游戏开发、Web开发等领域。 下面是实现网游客户端的完整攻略: 步骤一:选择开发工具 C#代码编写需要使用集成开发环境(IDE),以下是常用的C#开发工具: Visual Studio(免费或付费…

    C# 2023年6月3日
    00
  • C# 中AutoMapper的使用方法

    下面是“C# 中AutoMapper的使用方法”的完整攻略: 1. AutoMapper 简介 AutoMapper 是一个 .NET 框架下的对象映射工具,它的主要任务是通过配置文件自动地映射实体之间的属性,省去繁琐的手工编写属性映射代码。使用 AutoMapper 可以极大地提高代码的复用性以及开发效率。 2. 安装 AutoMapper 使用 NuGe…

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