Json.NET deserialization of Tuple<…> inside another type doesn't work?

后端 未结 3 1420
天涯浪人
天涯浪人 2021-01-02 11:01

Using Json.net, deserializing a type that contains a Tuple<...> doesn\'t work (serialization works, but deserialization doesn\'t):

[TestMe         


        
3条回答
  •  执念已碎
    2021-01-02 12:02

    I ended up with something more generic, hope it helps

    public class TupleConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            var match = Regex.Match(objectType.Name, "Tuple`([0-9])", RegexOptions.IgnoreCase);
            return match.Success;
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
                return null;
    
            try
            {
                var tupleTypes = objectType.GetProperties().ToList().Select(p => p.PropertyType).ToArray();
    
                var jObject = Newtonsoft.Json.Linq.JObject.Load(reader);
    
                var valueItems = new List();
    
                for (var i = 1; i <= tupleTypes.Length; i++)
                    valueItems.Add(jObject[$"m_Item{i}"].ToObject(tupleTypes[i - 1]));
    
                var convertedObject = objectType.GetConstructor(tupleTypes)?.Invoke(valueItems.ToArray());
    
                return convertedObject;
            }
            catch (Exception ex)
            {
                throw new Exception("Something went wrong in this implementation", ex);
            }
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            serializer.Serialize(writer, value);
        }
    }
    
        

    提交回复
    热议问题