dynamically change the json property name and serialize

前端 未结 2 583
旧巷少年郎
旧巷少年郎 2020-12-12 06:50

i want to change the json property name dynamically and serialize the object.

here is my json for two different entities

For customer



        
相关标签:
2条回答
  • 2020-12-12 07:21

    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));
        }
    
    0 讨论(0)
  • 2020-12-12 07:24

    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");
    
    0 讨论(0)
提交回复
热议问题