Get a list of JSON property names from a class to use in a query string

后端 未结 4 1367
清歌不尽
清歌不尽 2020-12-10 11:48

If I have a C# model class that is used by JSON.net to bind data from a serialized JSON string, is there a way that I can create a query string from that class in order to m

4条回答
  •  醉话见心
    2020-12-10 12:33

    In cases where the model is only partially annotated with [JsonProperty(PropertyName = "XXX")] attributes, or is annotated with data contract attributes, or has ignored properties, you can use Json.NET's own contract resolver to obtain the list of serialized property names. First, introduce the following extension method:

    public static class JsonExtensions
    {
        public static string [] PropertyNames(this IContractResolver resolver, Type type)
        {
            if (resolver == null || type == null)
                throw new ArgumentNullException();
            var contract = resolver.ResolveContract(type) as JsonObjectContract;
            if (contract == null)
                return new string[0];
            return contract.Properties.Where(p => !p.Ignored).Select(p => p.PropertyName).ToArray();
        }
    }
    

    Then, do:

    // Allocate the relevant contract resolver. 
    // Options are CamelCasePropertyNamesContractResolver() or DefaultContractResolver().
    IContractResolver resolver = new DefaultContractResolver(); 
    
    // Get properties
    var propertyNames = resolver.PropertyNames(typeof(model));
    var fields = "&fields=" + String.Join(",", propertyNames);
    

    For resolver use CamelCasePropertyNamesContractResolver if you are camel casing your property names (which ASP.NET Core Web API does by default); otherwise use DefaultContractResolver.

    Sample fiddle.

提交回复
热议问题