Reputation: 8425
i want to change the json property name dynamically and serialize the object.
here is my json for two different entities
For customer
{
"userName": "66666",
"password": "test1234",
"customersList": [
{
"address": "Test Stree2",
"customerNumber": "US01-000281",
"city": ""
}
]
}
For contact
{
"userName": "66666",
"password": "test1234",
"contactList": [
{
"address": "Test stree1",
"contactNumber": "US01-000281",
"city": ""
}
]
}
and the model that is holding this data is as follows
public class URequest<T>
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string userName { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string password { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public IList<T> requestList { get; set; }
}
in above code requestList
could contain list of contacts
or customer
but while sending i want to change the requestList
json property name to respective entity name i.e. for customer
it will be customerList
and for contact
it will be contactList
after serializing.
Upvotes: 1
Views: 22226
Reputation: 8425
using the ContentResolver
i have solve the issue
here is the code
public class UserRequestResolver : DefaultContractResolver
{
private string propertyName;
public UserRequestResolver()
{
}
public UserRequestResolver(string name)
{
propertyName = name;
}
public new static readonly UserRequestResolver Instance = new UserRequestResolver();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (property.PropertyName == "requestList")
{
property.PropertyName = propertyName;
}
return property;
}
}
once can pass specific property name in the constructor.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new UserRequestResolver("contactList");
Upvotes: 4
Reputation: 331
You can create a custom JsonConverter.
Using custom JsonConverter in order to alter the serialization of the portion of an object
Example
public class Customer
{
public string Name { get; set; }
}
public class Client
{
public string Name { get; set; }
}
public class URequest<T>
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string userName { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string password { get; set; }
[JsonIgnore]
public IList<T> requestList { get; set; }
}
public class URequestConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(URequest<T>));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var objectType = value.GetType().GetGenericArguments()[0];
URequest<T> typedValue = (URequest<T>) value;
JObject containerObj = JObject.FromObject(value);
containerObj.Add($"{objectType.Name.ToLower()}List", JToken.FromObject(typedValue.requestList));
containerObj.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
You can use it like this
[TestMethod]
public void TestMethod1()
{
URequest<Customer> request = new URequest<Customer>();
request.password = "test";
request.userName = "user";
request.requestList = new List<Customer>();
request.requestList.Add(new Customer() { Name = "customer" });
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.Converters.Add(new URequestConverter<Customer>());
Console.WriteLine(JsonConvert.SerializeObject(request, settings));
}
Upvotes: 6