Json.NET(Newtonsoft.Json) 对象序列化为JSON时自定义某些属性的展示或隐藏

我们经常在生产当中需要根据不同的场景需求使用Json.NET(Newtonsoft.Json) 提供不同的API数据结构,例如某个对象当中其中几项不能对外(API)提供数据展示,但是需要对内部(API)系统提供展示,这个时候我们可能为此建立多个不同的业务实体进行相应的赋值然后进行序列化来解决这个问题;其实 Json.NET(Newtonsoft.Json) 为我们做了相应的功能(如:通过JsonIgnore / JsonProperty 特性)来处理,可是这个不能满足我们的需求,但是Json.NET(Newtonsoft.Json)提供了一些高级功能,通过继承 DefaultContractResolver 重写 CreateProperties 方法来实现,我将实现的代码贴出来,希望对大家有所帮助

    /// <summary>
    /// 属性选项
    /// Add by 成长的小猪(Jason.Song) on 2017/08/01
    /// 文章来源于成长的小猪
    /// http://blog.csdn.net/jasonsong2008
    /// </summary>
    public enum PropertyOption
    {
        /// <summary>
        /// 包含/展示 某些属性
        /// </summary>
        Include,
        /// <summary>
        /// 排除/隐藏 某些属性
        /// </summary>
        Exclude
    }

    /// <inheritdoc />
    /// <summary>
    /// 属性展示设置
    /// 设置包含某个属性或排除某个属性
    /// Add by 成长的小猪(Jason.Song)on 2017/08/01
    /// 文章来源于成长的小猪
    /// http://blog.csdn.net/jasonsong2008
    /// </summary>
    public class PropertyDisplayResolver : DefaultContractResolver
    {
        private readonly PropertyOption _propertyOption;
        private readonly IEnumerable<string> _propertyNames;

        /// <inheritdoc />
        /// <summary>
        /// 初始化实例
        /// Add by 成长的小猪(Jason.Song) on 2017/08/01
        /// </summary>
        /// <param name="propertyOption">属性选项:Include包含/Exclude排除</param>
        /// <param name="propertyNames">属性名称列表</param>
        public PropertyDisplayResolver(PropertyOption propertyOption, IEnumerable<string> propertyNames) {
            _propertyOption = propertyOption;
            _propertyNames = propertyNames;
        }


        /// <inheritdoc />
        /// <summary>
        /// 初始化实例
        /// Add by 成长的小猪(Jason.Song) on 2017/08/01
        /// </summary>
        /// <param name="propertyOption">属性选项:Include包含/Exclude排除</param>
        /// <param name="propertyNames">属性名称</param>
        public PropertyDisplayResolver(PropertyOption propertyOption, params string[] propertyNames) {
            _propertyOption = propertyOption;
            _propertyNames = propertyNames;
        }

        /// <inheritdoc />
        /// <summary>
        /// 重写 DefaultContractResolver 里的 CreateProperties创建属性方法
        /// Add by 成长的小猪(Jason.Song) on 2017/08/01
        /// Creates properties for the given <see cref="T:Newtonsoft.Json.Serialization.JsonContract" />.
        /// </summary>
        /// <param name="type">The type to create properties for.</param>
        /// <param name="memberSerialization">The member serialization mode for the type.</param>
        /// <returns>Properties for the given <see cref="T:Newtonsoft.Json.Serialization.JsonContract" />.</returns>
        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) {
            var properties = base.CreateProperties(type, memberSerialization).ToList();
            //此处进行筛选
            return _propertyOption == PropertyOption.Include ? properties.FindAll(p => _propertyNames.Contains(p.PropertyName)) 
                : properties.FindAll(p => !_propertyNames.Contains(p.PropertyName));
        }


    }

以下是使用方法和测试的代码

    /// <summary>
    /// 用户实体(测试)
    /// 文章来源于成长的小猪
    /// http://blog.csdn.net/jasonsong2008
    /// </summary>
    public class User
    {
        /// <summary>
        /// 用户ID
        /// </summary>
        public int UserId { get; set; }
        /// <summary>
        /// 用户名
        /// </summary>
        public string Username { get; set; }
        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; }
        /// <summary>
        /// 真实姓名
        /// </summary>
        public string Realname { get; set; }
    }


    /// <summary>
    /// Json.NET(Newtonsoft.Json) 特殊场景使用方法
    /// 文章来源于成长的小猪
    /// http://blog.csdn.net/jasonsong2008
    /// </summary>
    [TestFixture()]
    public class PropertyDisplayResolverTests
    {

        [Test()]
        public void PropertyDisplayResolverTest() {
            //测试实体数据
            var user = new User
            {
                UserId = 8888,
                Username = "jason",
                Password = "jasonsong",
                Realname = "成长的小猪"
            };

            //正常情况下转换对象为Json字符串
            //var json = JsonConvert.SerializeObject(user);

            //输出的结果为:
            //{"UserId":8888,"Username":"jason","Password":"jasonsong","Realname":"成长的小猪"}



            //如果我们不希望展示 Password 密码属性,可以使用排除选项 PropertyOption.Exclude
            //var json = JsonConvert.SerializeObject(user, new JsonSerializerSettings {
            //    ContractResolver = new PropertyDisplayResolver(PropertyOption.Exclude, "Password")
            //});

            //输出的结果为:
            //{"UserId":8888,"Username":"jason","Realname":"成长的小猪"}



            //如果我们只想输出用户名 Username 和 Realname 属性,可以使用包含选项 PropertyOption.Include
            var json = JsonConvert.SerializeObject(user, new JsonSerializerSettings {
                ContractResolver = new PropertyDisplayResolver(PropertyOption.Include, "Username", "Realname")
            });

            //输出的结果为:
            //{"Username":"jason","Realname":"成长的小猪"}



            Assert.Warn(json);
            
        }

    }

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 VB.NET 中使用 Newtonsoft.Json 序列化结构体的过程与序列化类的过程类似。你可以使用 `JsonConvert.SerializeObject` 方法将结构体对象转换为 JSON 字符串,以及使用 `JsonConvert.DeserializeObject` 方法将 JSON 字符串转换回结构体对象。 以下是一个示例代码,演示如何使用 Newtonsoft.Json 序列化结构体: ```vb Imports Newtonsoft.Json ' 定义一个结构体 Public Structure Person Public Name As String Public Age As Integer End Structure Sub Main() ' 创建一个结构体对象 Dim person As New Person With { .Name = "John", .Age = 25 } ' 序列化结构体为 JSON 字符串 Dim json As String = JsonConvert.SerializeObject(person) ' 输出序列化后的 JSON 字符串 Console.WriteLine(json) ' 反序列化 JSON 字符串为结构体对象 Dim deserializedPerson As Person = JsonConvert.DeserializeObject(Of Person)(json) ' 输出反序列化后的结构体对象属性值 Console.WriteLine(deserializedPerson.Name) Console.WriteLine(deserializedPerson.Age) End Sub ``` 在这个示例中,我们首先定义了一个名为 `Person` 的结构体,其中包含了 `Name` 和 `Age` 两个属性。 然后,我们创建了一个 `Person` 结构体对象,并设置了其属性值。 接下来,使用 `JsonConvert.SerializeObject` 方法将结构体对象序列化JSON 字符串,并将结果存储在 `json` 变量中。 然后,我们输出序列化后的 JSON 字符串。 最后,使用 `JsonConvert.DeserializeObject` 方法将 JSON 字符串反序列化为 `Person` 结构体对象,并将结果存储在 `deserializedPerson` 变量中。 最后,我们输出反序列化后的结构体对象属性值。 确保在项目中引用了 Newtonsoft.Json 库,并在代码文件中导入了命名空间 `Newtonsoft.Json`。 希望这个示例能够帮助你在 VB.NET 中使用 Newtonsoft.Json 序列化结构体。如果你还有其他问题,请随提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值