Json   发布时间:2022-04-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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,请注明来意。