JSON deserialization - Map array indices to properties with JSON.NET

后端 未结 2 1390
北海茫月
北海茫月 2020-11-29 12:33

I want to deserialize a 2-dimensional array to a collection of .net objects. The reason is, array syntax will be easier for my user to work with in an input file. So I just

2条回答
  •  执念已碎
    2020-11-29 13:14

    You can do this with a JsonConverter. A simple converter for this purpose would be:

    public class PersonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(Person);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
                return null;
            var array = JArray.Load(reader);
            var person = (existingValue as Person ?? new Person());
            person.First = (string)array.ElementAtOrDefault(0);
            person.Last = (string)array.ElementAtOrDefault(1);
            person.Age = (string)array.ElementAtOrDefault(2);
            return person;
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var person = (Person)value;
            serializer.Serialize(writer, new[] { person.First, person.Last, person.Age });
        }
    }
    

    If the specific properties have non-primitive types, you can use JToken.ToObject(JsonSerializer) to deserialize them to the required type:

    person.First = array.ElementAtOrDefault(0)?.ToObject(serializer);
    

    Then you can apply it to your class:

    [JsonConverter(typeof(PersonConverter))]
    public class Person
    {
        public string First { get; set; }
        public string Last { get; set; }
        public string Age { get; set; }
    }
    

    Or use it in settings:

    var settings = new JsonSerializerSettings { Converters = new [] { new PersonConverter() } };
    var list = JsonConvert.DeserializeObject>(json, settings);
    

提交回复
热议问题