Ejemplo n.º 1
0
 public void CamelCaseIsConvertedToSnakeCase()
 {
     Assert.AreEqual("single", PropertyCasingHelper.CamelToSnake("Single"));
     Assert.AreEqual("two_words", PropertyCasingHelper.CamelToSnake("TwoWords"));
     Assert.AreEqual("test_many_separate_words_next_to_each_other", PropertyCasingHelper.CamelToSnake("TestManySeparateWordsNextToEachOther"));
     Assert.AreEqual("test_1_number", PropertyCasingHelper.CamelToSnake("Test1Number"));
     Assert.AreEqual("test_451_numbers", PropertyCasingHelper.CamelToSnake("Test451Numbers"));
 }
Ejemplo n.º 2
0
 public void SnakeCaseIsConvertedToCamelCase()
 {
     Assert.AreEqual("Single", PropertyCasingHelper.SnakeToCamel("single"));
     Assert.AreEqual("TwoWords", PropertyCasingHelper.SnakeToCamel("two_words"));
     Assert.AreEqual("ManySeparateWords", PropertyCasingHelper.SnakeToCamel("many_separate_words"));
     Assert.AreEqual("ANumber3WithWords", PropertyCasingHelper.SnakeToCamel("a_number_3_with_words"));
     Assert.AreEqual("ManyNumeric345Digits", PropertyCasingHelper.SnakeToCamel("many_numeric_345_digits"));
     Assert.AreEqual("WordAndAnother", PropertyCasingHelper.SnakeToCamel("wOrd_and_ANOTHER"));
 }
Ejemplo n.º 3
0
 public void AllCapitalsAreNotConverted()
 {
     Assert.AreEqual("DESC", PropertyCasingHelper.CamelToSnake("DESC"));
     Assert.AreEqual("de_s_c", PropertyCasingHelper.CamelToSnake("DeSC"));
     Assert.AreEqual("DESC", PropertyCasingHelper.SnakeToCamel("DESC"));
 }
Ejemplo n.º 4
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                return(null);
            }

            Type type = GetUnderlyingType(objectType);

            if (type.IsEnum)
            {
                if (reader.TokenType == JsonToken.String)
                {
                    string   enumText = PropertyCasingHelper.SnakeToCamel(reader.Value.ToString());
                    string[] names    = Enum.GetNames(type);
                    string   match    = names.FirstOrDefault(n => String.Equals(n, enumText, StringComparison.InvariantCultureIgnoreCase));
                    if (match != null)
                    {
                        return(Enum.Parse(type, match));
                    }
                }
                else if (reader.TokenType == JsonToken.Integer)
                {
                    int   enumVal = Convert.ToInt32(reader.Value);
                    int[] values  = (int[])Enum.GetValues(type);
                    if (values.Contains(enumVal))
                    {
                        return(Enum.ToObject(type, enumVal));
                    }
                }
                WarnOfMissingDeserializationOpportunity(reader.Value.ToString(), type.FullName);
                return(null);
            }

            object instance = objectType.GetConstructor(Type.EmptyTypes).Invoke(null);

            PropertyInfo[] properties = objectType.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

            IEnumerable <JProperty> jsonProperties = JObject.Load(reader).Properties();

            foreach (JProperty jsonProperty in jsonProperties)
            {
                string       name     = PropertyCasingHelper.SnakeToCamel(jsonProperty.Name);
                PropertyInfo property = properties.FirstOrDefault(pi => String.Equals(pi.Name, name, StringComparison.OrdinalIgnoreCase));

                if (property != null)
                {
                    if (jsonProperty.Value.Type != JTokenType.Null && !IsUnparseableNumeric(property, jsonProperty))
                    {
                        if (property.PropertyType == typeof(DateTime?))
                        {
                            //Want DateTimes to always be treated as UTC
                            var rawDate       = (DateTime)jsonProperty.Value.ToObject(typeof(DateTime), serializer);
                            var convertedDate = new DateTime();
                            switch (rawDate.Kind)
                            {
                            case DateTimeKind.Local:
                                convertedDate = rawDate.ToUniversalTime();
                                break;

                            case DateTimeKind.Unspecified:
                                convertedDate = DateTime.SpecifyKind(rawDate, DateTimeKind.Utc);
                                break;

                            case DateTimeKind.Utc:
                                convertedDate = rawDate;
                                break;
                            }
                            property.SetValue(instance, convertedDate, null);
                        }
                        else
                        {
                            if (property.Name == "Choices" && jsonProperty.Value.Type != JTokenType.Array)
                            {
                                var legacyProperty = properties.FirstOrDefault(pi => String.Equals("LegacyChoices", pi.Name, StringComparison.OrdinalIgnoreCase));
                                legacyProperty.SetValue(instance, jsonProperty.Value.ToObject(legacyProperty.PropertyType, serializer), null);
                            }
                            else
                            {
                                property.SetValue(instance, jsonProperty.Value.ToObject(property.PropertyType, serializer), null);
                            }
                        }
                    }
                }
                else
                {
                    WarnOfMissingDeserializationOpportunity(jsonProperty.Name, type.Name);
                }
            }
            return(instance);
        }