c# - 使用 Json.Net 仅序列化选定的属性

标签 c# json json.net

我只想使用 Json.NET 序列化对象的某些属性。
我使用的解决方案类似于帖子 Json.net serialize only certain properties 中描述的解决方案。
我的问题是,我想每次都选择不同的属性,并且出于性能原因,对 CreateContract(进而调用 CreateProperties)的调用正在被缓存(源代码:https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs ).

有没有办法只序列化我想要的属性,每次指定不同的属性,可能不需要重写整个 DefaultContractResolver 类?

这是一个显示这个问题的程序:

    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using Newtonsoft.Json.Serialization;
    using System;
    using System.Collections.Generic;
    using System.Linq;

    class Person {
        public int Id;
        public string FirstName;
        public string LastName;
    }

    public class SelectedPropertiesContractResolver<T> : CamelCasePropertyNamesContractResolver {

        HashSet<string> _selectedProperties;

        public SelectedPropertiesContractResolver(IEnumerable<string> selectedProperties) {
            _selectedProperties = selectedProperties.ToHashSet();
        }

        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) {
            if (type == typeof(T)) {
                return base.CreateProperties(type, memberSerialization)
                    .Where(p => _selectedProperties.Contains(p.PropertyName, StringComparer.OrdinalIgnoreCase)).ToList();
            }
            return base.CreateProperties(type, memberSerialization);
        }

    }


    class Program {

        static void Main(string[] args) {

            var person = new Person { Id = 1, FirstName = "John", LastName = "Doe" };

            var serializer1 = new JsonSerializer {
                ContractResolver = new SelectedPropertiesContractResolver<Person>(new[] { "Id", "FirstName" })
            };

            // This will contain only Id and FirstName, as expected
            string json1 = JObject.FromObject(person, serializer1).ToString();

            var serializer2 = new JsonSerializer {
                ContractResolver = new SelectedPropertiesContractResolver<Person>(new[] { "LastName" })
            };

            // Since calls to CreateProperties are cached, this will contain Id and FirstName as well, instead of LastName.
            string json2 = JObject.FromObject(person, serializer2).ToString();

        }
    }

最佳答案

您可以覆盖 ResolveContract 方法并始终创建新契约(Contract)(或者甚至更好 - 根据类型 T_selectedProperties< 提供您自己的奇特缓存方式内容)

public class SelectedPropertiesContractResolver<T> : CamelCasePropertyNamesContractResolver {

    ...

    public override JsonContract ResolveContract(Type type)
    {
        return CreateContract(type);
    }
}

关于c# - 使用 Json.Net 仅序列化选定的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54710790/

相关文章:

c# - JSON 数组到 ExpandoObject 通过 JSON.NET

c# - 通过使用 C# 指令在 ASP.NET MVC 应用程序中启用 "Debug mode"

c# - 通过 HTTP Post 发送 XML 到 IP :Port

c# - Autofac 用具体类型注册泛型实例

ruby-on-rails - rails 5.1。 : cannot get JSON object from string

json - 如何用 aeson 解析嵌套的 JSON

asp.net-web-api - 无法使MVC4 WebApi在JSON中包含空字段

c# - 使用 JSON.NET 的序列化字段的顺序

c# - ASP.NET 敏捷包 |如何解析网页。那是取post参数?

json - bower init - bower.json 中 'private' 选项的目的是什么?