分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

Json.net 动态序列化属性

发布时间:2023-09-06 02:31责任编辑:郭大石关键词:暂无标签

环境说明

服务端有个接口,返回json格式的数据,要求输出数据的字段由客户端决定。

测试样例

using Newtonsoft.Json;using System;namespace Hitearth{ ???class Hitearth ???{ ???????static void Main(string[] args) ???????{ ???????????var demos = new[] ???????????{ ???????????????new demo { attr1 = "11", attr2 = "12",attr3 = "13" }, ???????????????new demo { attr1 = "21", attr2 = "22",attr3 = "23" }, ???????????}; ???????????var demo2 = new demo(); ???????????demo2.obj = demo2; ???????????var demo3 = new demo { attr2 = "demo3" }; ???????????demo3.obj = new demo { attr2 = "demo3.obj", obj = new demo { attr2 = "demo3.obj.obj" } }; ???????????Console.WriteLine(JsonConvert.SerializeObject(demos)); ?// [{"attr1":"11","attr2":"12","attr3":"13","obj":null},{"attr1":"21","attr2":"22","attr3":"23","obj":null}] ???????????test(demos, "attr1 attr2".Split(‘ ‘)); // [{"attr1":"11","attr2":"12"},{"attr1":"21","attr2":"22"}] ???????????test(demos, "attr2 attr3".Split(‘ ‘)); // [{"attr2":"12","attr3":"13"},{"attr2":"22","attr3":"23"}] ???????????test(demos, new string[] { }); // [{},{}] ???????????test(demo2, "attr2 attr3".Split(‘ ‘)); ?// {"attr2":null,"attr3":null} ???????????test(demo2, "attr2 obj".Split(‘ ‘)); ?// Self referencing loop detected with type ‘Hitearth.demo‘.Path ‘‘. ???????????test(demo3, "attr2 obj".Split(‘ ‘));// {"attr2":"demo3","obj":{"attr2":"demo3.obj","obj":{"attr2":"demo3.obj.obj","obj":null}}} ???????} ???????static void test(object obj, string[] attrs) ???????{ ???????????try ???????????{ ???????????????Console.WriteLine(JsonConvert.SerializeObject(obj, new FilterPropertiesJsonConverter(typeof(demo), attrs))); ???????????} ???????????catch (Exception ex) ???????????{ ???????????????Console.WriteLine(ex.Message); ???????????} ???????} ???} ???public class demo ???{ ???????public string attr1 { get; set; } ???????public string attr2 { get; set; } ???????public string attr3 { get; set; } ???????public demo obj { get; set; } ???}}

  

using Newtonsoft.Json;using Newtonsoft.Json.Serialization;using System;using System.Linq;namespace Hitearth{ ???/// <summary> ???/// 只序列化 jsonProperties 指定的字段 ???/// </summary> ???/// <typeparam name="T"></typeparam> ???public class FilterPropertiesJsonConverter : JsonConverter ???{ ???????Type type; string[] jsonProperties; bool reversed = false; ???????public FilterPropertiesJsonConverter(Type type, string[] jsonProperties, bool reversed = false) ???????{ ???????????if (type == null) throw new ArgumentNullException("type"); ???????????if (jsonProperties == null) throw new ArgumentNullException("jsonProperties"); ???????????this.type = type; ???????????this.jsonProperties = jsonProperties; ???????????this.reversed = reversed; ???????} ???????public override bool CanConvert(Type objectType) ???????{ ???????????return objectType == type; ???????} ???????public override bool CanRead { get { return false; } } ???????public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } ???????public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) ???????{ ???????????if (value == null) ???????????{ ???????????????writer.WriteNull(); ???????????????return; ???????????} ???????????var contract = serializer.ContractResolver.ResolveContract(value.GetType()) as JsonObjectContract; ???????????writer.WriteStartObject(); ???????????if (contract != null) ???????????{ ???????????????foreach (var item in contract.Properties) ???????????????{ ???????????????????if (jsonProperties.Contains(item.PropertyName) == reversed) ???????????????????????continue; ???????????????????writer.WritePropertyName(item.PropertyName); ???????????????????serializer.Serialize(writer, item.ValueProvider.GetValue(value)); ???????????????} ???????????} ???????????writer.WriteEndObject(); ???????} ???}}

Json.net 动态序列化属性

原文地址:https://www.cnblogs.com/hitearth/p/10323186.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved