Deserialize JSON array of arrays into List of Tuples using Newtonsoft

前端 未结 4 743
半阙折子戏
半阙折子戏 2021-01-05 09:48

I am receiving data that looks like this from an online service provider:

{
  name: \"test data\",
  data: [
    [ \"2017-05-31\", 2388.33 ],
    [ \"2017-04         


        
4条回答
  •  一个人的身影
    2021-01-05 10:43

    If anyone is interested in a more generic solution for ValueTuples

    public class TupleConverter : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var type = value.GetType();
            var array = new List();
            FieldInfo fieldInfo;
            var i = 1;
    
            while ((fieldInfo = type.GetField($"Item{i++}")) != null)
                array.Add(fieldInfo.GetValue(value));
    
            serializer.Serialize(writer, array);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var argTypes = objectType.GetGenericArguments();
            var array = serializer.Deserialize(reader);
            var items = array.Select((a, index) => a.ToObject(argTypes[index])).ToArray();
    
            var constructor = objectType.GetConstructor(argTypes);
            return constructor.Invoke(items);
        }
    
        public override bool CanConvert(Type type)
        {
            return type.Name.StartsWith("ValueTuple`");
        }
    }
    
    
    

    Usage is as follows:

    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new TupleConverter());
    
    var list = new List<(DateTime, double)>
    {
        (DateTime.Now, 7.5)
    };
    var json = JsonConvert.SerializeObject(list, settings);
    var result = JsonConvert.DeserializeObject(json, list.GetType(), settings);
    

    提交回复
    热议问题