大佬教程收集整理的这篇文章主要介绍了Json.net 动态序列化属性,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
服务端有个接口,返回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"},"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; } } }
@H_874_20@using Newtonsoft.Json; @H_874_20@using Newtonsoft.Json.serialization; @H_874_20@using System; @H_874_20@using System.Linq; @H_874_20@namespace Hitearth { /// <sumMary> /// 只序列化 jsonProperties 指定的字段 /// </sumMary> /// <typeparam name="T"></typeparam> @H_874_20@public @H_874_20@class FilterPropertiesJsonConverter : JsonConverter { Type type; @H_874_20@String[] jsonProperties; @H_874_20@bool reversed = @H_874_20@false; @H_874_20@public FilterPropertiesJsonConverter(Type type,@H_874_20@String[] jsonProperties,@H_874_20@bool reversed = @H_874_20@false) { @H_874_20@if (type == @H_874_20@null) @H_874_20@throw @H_874_20@new ArgumentNullException("type"); @H_874_20@if (jsonProperties == @H_874_20@null) @H_874_20@throw @H_874_20@new ArgumentNullException("jsonProperties"); @H_874_20@this.type = type; @H_874_20@this.jsonProperties = jsonProperties; @H_874_20@this.reversed = reversed; } @H_874_20@public @H_874_20@override @H_874_20@bool CanConvert(Type objectTypE) { @H_874_20@return objectType == type; } @H_874_20@public @H_874_20@override @H_874_20@bool CanRead { @H_874_20@get { @H_874_20@return @H_874_20@false; } } @H_874_20@public @H_874_20@override @H_874_20@object ReadJson(JsonReader reader,Type objectType,@H_874_20@object exisTingValue,Jsonserializer serializer) { @H_874_20@throw @H_874_20@new NotImplementedException(); } @H_874_20@public @H_874_20@override @H_874_20@void WriteJson(JsonWriter writer,@H_874_20@object value,Jsonserializer serializer) { @H_874_20@if (value == @H_874_20@null) { writer.WriteNull(); @H_874_20@return; } @H_874_20@var contract = serializer.ContractResolver.ResolveContract(value.GetType()) @H_874_20@as JsonObjectContract; writer.WriteStartObject(); @H_874_20@if (contract != @H_874_20@null) { @H_874_20@foreach (@H_874_20@var item @H_874_20@in contract.Properties) { @H_874_20@if (jsonProperties.Contains(item.PropertyName) == reversed) @H_874_20@conTinue; writer.WritePropertyName(item.PropertyName); serializer.serialize(writer,item.ValueProvider.GetValue(value)); } } writer.WriteEndObject(); } } }
以上是大佬教程为你收集整理的Json.net 动态序列化属性全部内容,希望文章能够帮你解决Json.net 动态序列化属性所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。