JsonProperty - Use different name for deserialization, but use original name for serialization?

后端 未结 2 611
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-10 06:44

I am retrieving JSON from an API. I am using newtonsoft (this is json.net right?) to deserialize this into a list of objects. It works.

Unfortunately I also need to

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

    You might be able to write a custom JsonConverter to do it with just one Person class, but I'd recommend having separate classes, since the data is modeled differently in the two places. Even if you don't plan to right now, you might find yourself needing to deserialize from Name or serialize to pname at some point. This also allows your classes to differ more substantially. You could use AutoMapper (or similar) to easily convert between the two. E.g.

    public class PersonFromThatApi
    {
        [JsonProperty("pname")]
        public string Name { get; set; }
    }
    public class Person
    {
        public string Name { get; set; }
    }
    
    Mapper.CreateMap<PersonFromThatApi, Person>();
    Mapper.CreateMap<Person, PersonFromThatApi>();
    
    var person1 = JsonConvert.DeserializeObject<PersonFromThatApi>(
                                   @"{""pname"":""George""}");
    Person person2 = Mapper.Map<Person>(person1);
    string s = JsonConvert.SerializeObject(person2); // {"Name":"George"}
    

    And yes, Newtonsoft.Json is the namespace of Json.NET. Don't ask me why they chose totally different names for those two things.

    0 讨论(0)
  • 2020-12-10 07:18

    You can create a custom contract resolver that sets the property names back to the ones you've defined in the C# class before serilization. Below is some example code;

    class OriginalNameContractResolver : DefaultContractResolver
    {
        protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
        {
            // Let the base class create all the JsonProperties 
            IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
    
            // assign the C# property name
            foreach (JsonProperty prop in list)
            {
                prop.PropertyName = prop.UnderlyingName;
            }
    
            return list;
        }
    }
    

    Use it like this;

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.Formatting = Formatting.Indented;
        if (useLongNames)
        {
            settings.ContractResolver = new OriginalNameContractResolver();
        }
    
        string response = JsonConvert.SerializeObject(obj, settings);
    
    0 讨论(0)
提交回复
热议问题