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日

相关文章

  • 记一次 .NET 某车零件MES系统 登录异常分析

    一:背景 1. 讲故事 这个案例有点特殊,以前dump分析都是和软件工程师打交道,这次和非业内人士交流,隔行如隔山,从指导dump怎么抓到问题解决,需要一个强大的耐心。 前几天有位朋友在微信上找到我,说他们公司采购的MES系统登录的时候出现了异常,让我帮忙看一下,我在想解铃还须系铃人,怎么的也不应该找到我呀,据朋友反馈项目已经验收,那边给了回馈是网络的问题,…

    C# 2023年5月8日
    00
  • visual studio 2013常用快捷键 VS2013快捷键大全

    Visual Studio 2013常用快捷键 VS2013快捷键大全 Visual Studio 2013是一个强大的开发工具,其丰富的快捷键让开发变得更加高效。以下是一些常用快捷键和使用技巧,以帮助你更好地使用Visual Studio 2013。 常用快捷键 以下是一些常用快捷键: Ctrl + C / Ctrl + V:复制和粘贴代码或文字。 Ctr…

    C# 2023年6月6日
    00
  • c# 类型转换

    下面是关于”c#类型转换”的完整攻略。 什么是类型转换? C#的类型转换是将一种数据类型的变量转换为另一种数据类型的变量。在C#中,类型转换有两种形式:隐式转换和显式转换。 隐式转换(Implicit Cast):是从小的数据类型向大的数据类型转换的,不需要进行任何特殊处理。C#程序员无需编写任何代码来实现隐式类型转换,开发环境会自动帮助我们实现。 显式转换…

    C# 2023年5月31日
    00
  • C#通过oledb访问access数据库的方法

    C#通过oledb访问access数据库的完整攻略 简介 在C#中,我们可以使用OLE DB提供程序来访问基于 OLE DB 的数据库。Microsoft Access是OLE DB的支持者之一,因此我们可以使用OLE DB连接器来访问Microsoft Access数据库。这篇攻略将向您介绍如何通过OLE DB访问Access数据库。 步骤 以下是访问Ac…

    C# 2023年6月2日
    00
  • C#11新特性使用案例详解

    C#11新特性使用案例详解 C#语言在11版的时候增加了一些新特性,这些新特性可以让我们在编写代码时更加方便,提高代码的可读性和性能。接下来我们来详细讲解一下这些新特性的使用案例。 新特性列表 以下是C#11中新增加的新特性: 针对null的操作符 ?, ?? 和 ?. 元组的方法和参数 局部函数的放宽限制 外来机构的类定义 用括号来括起不支持的字面表达式类…

    C# 2023年5月14日
    00
  • 模拟人生4怎么复活死去的人物 复活死去人物的方法

    模拟人生4怎么复活死去的人物:完整攻略 在模拟人生4中,如果你的人物不幸“去世”,可以通过以下两种方法将他们复活: 方法一:使用“消费者保障” 在游戏中按下CTRL+Shift+C,弹出命令输入框,在其中输入testingcheats true,使得测试命令成为可用状态。 按下CTRL+Shift+C打开命令框,输入“cas.fulleditmode”(不带…

    C# 2023年6月6日
    00
  • .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别介绍

    .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别介绍 在 .NET 生态系统中,有多个不同的平台和框架,包括 .NET Core、Xamarin、.NET Standard和.NET Framework。这些平台和框架之间有很多区别,本攻略将详细介绍它们之间的区别。 .NET Core .NET Co…

    C# 2023年5月17日
    00
  • C#实现文字视频生成器的示例代码

    让我为您详细讲解一下“C#实现文字视频生成器的示例代码”的完整攻略。 简介 文字视频生成器是一种将文本内容转换为视频的工具,通常用来制作广告、宣传视频等。本攻略将介绍如何使用C#实现一个简单的文字视频生成器。 准备工作 要实现文字视频生成器,我们需要使用到以下工具和库: C#编程语言 FFmpeg:一个跨平台的视频处理工具,可以通过命令行方式调用 Emgu.…

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