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 make the initial request?
Model class example:
public class model { [JsonProperty(PropertyName = "id")] public long ID { get; set; } [JsonProperty(PropertyName = "some_string")] public string SomeString {get; set;} }
Querystring example:
baseUrl + uri + "&fields=id,some_string" + token
So the essence of what I am trying to do is gather both "id" and "some_string" from the model object so i can dynamically create a the "&fields" arguments. Thanks!
Objects are the mapping type in JSON. They map “keys” to “values”. In JSON, the “keys” must always be strings. Each of these pairs is conventionally referred to as a “property”.
JsonPropertyAttribute indicates that a property should be serialized when member serialization is set to opt-in. It includes non-public properties in serialization and deserialization. It can be used to customize type name, reference, null, and default value handling for the property value.
@Leigh Shepperson has the right idea; however, you can do it with less code using LINQ. I would create a helper method like this:
using System.Linq; using System.Reflection; using Newtonsoft.Json; ... public static string GetFields(Type modelType) { return string.Join(",", modelType.GetProperties() .Select(p => p.GetCustomAttribute<JsonPropertyAttribute>()) .Select(jp => jp.PropertyName)); }
You can use it like this:
var fields = "&fields=" + GetFields(typeof(model));
EDIT
If you're running under the 3.5 version of the .Net Framework such that you don't have the generic GetCustomAttribute<T>
method available to you, you can do the same thing with the non-generic GetCustomAttributes()
method instead, using it with SelectMany
and Cast<T>
:
return string.Join(",", modelType.GetProperties() .SelectMany(p => p.GetCustomAttributes(typeof(JsonPropertyAttribute)) .Cast<JsonPropertyAttribute>()) .Select(jp => jp.PropertyName) .ToArray());
You can do this using reflection. This is the general idea:
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Reflection; namespace ConsoleApplication8 { public class model { [JsonProperty(PropertyName = "id")] public long ID { get; set; } [JsonProperty(PropertyName = "some_string")] public string SomeString { get; set; } } internal class Program { private static void Main(string[] args) { var model = new model(); var result = string.Empty; PropertyInfo[] props = typeof(model).GetProperties(); foreach (PropertyInfo prop in props) { foreach (object attr in prop.GetCustomAttributes(true)) { result += (attr as JsonPropertyAttribute).PropertyName; } } } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With