/// <summary> /// 枚举值解析 /// </summary> /// <param name="jsonDeSerializer">JSON 反序列化</param> /// <param name="value">目标数据</param> /// <param name="index">第一个枚举索引</param> /// <param name="nextIndex">第二个枚举索引</param> protected static void getIndex(JsonDeSerializer jsonDeSerializer, ref T value, out int index, ref int nextIndex) { if ((index = enumSearcher.SearchFlagEnum(jsonDeSerializer)) == -1) { if (!jsonDeSerializer.Config.IsMatchEnum) { do { if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success || jsonDeSerializer.Quote == 0) { return; } }while ((index = enumSearcher.NextFlagEnum(jsonDeSerializer)) == -1); } else { jsonDeSerializer.DeSerializeState = DeSerializeState.NoFoundEnumValue; return; } } do { if (jsonDeSerializer.Quote == 0) { value = enumValues[index]; return; } if ((nextIndex = enumSearcher.NextFlagEnum(jsonDeSerializer)) != -1) { break; } }while (jsonDeSerializer.DeSerializeState == DeSerializeState.Success); }
/// <summary> /// 引用类型对象解析 /// </summary> /// <param name="jsonDeSerializer">Json解析器</param> /// <param name="value">目标数据</param> private static void deSerializeClass(JsonDeSerializer jsonDeSerializer, ref T value) { if (jsonDeSerializer.SearchObject()) { if (value == null) { if (AutoCSer.Metadata.DefaultConstructor <T> .Type == DefaultConstructorType.None) { jsonDeSerializer.CheckNoConstructor(ref value, isAnonymousType); if (value == null) { return; } } else { value = AutoCSer.Metadata.DefaultConstructor <T> .Constructor(); } } else if (isAnonymousType) { jsonDeSerializer.SetAnonymousType(value); } DeSerializeMembers(jsonDeSerializer, ref value); } else { if (value != null && isAnonymousType) { jsonDeSerializer.SetAnonymousType(value); } value = default(T); } }
public static KeyValue <DeSerializeResult, Node> toJsonNode <T>(this SubString json, DeSerializeConfig config = null) { KeyValue <DeSerializeResult, Node> value = default(KeyValue <DeSerializeResult, Node>); value.Key = JsonDeSerializer.DeSerialize(ref json, ref value.Value, config); return(value); }
public static void DeSerialize(JsonDeSerializer jsonDeSerializer, ref T value) { if (!tryDeSerializeNumber(jsonDeSerializer, ref value)) { deSerialize(jsonDeSerializer, ref value); } }
/// <summary> /// 根据枚举字符串查找目标索引 /// </summary> /// <param name="jsonDeSerializer">JSON 解析器</param> /// <param name="value">当前字符</param> /// <returns>目标索引,null返回-1</returns> private int flagEnum(JsonDeSerializer jsonDeSerializer, char value) { byte *currentState = State; do { char *prefix = (char *)(currentState + *(int *)currentState); if (*prefix != 0) { if (value != *prefix) { return(-1); } while (*++prefix != 0) { if (jsonDeSerializer.NextEnumChar() != *prefix) { return(-1); } } value = jsonDeSerializer.NextEnumChar(); } if (value == 0 || value == ',') { return(jsonDeSerializer.DeSerializeState == DeSerializeState.Success ? *(int *)(currentState + sizeof(int) * 2) : -1); } if (*(int *)(currentState + sizeof(int)) == 0) { return(-1); } int index = value < 128 ? (int)*(ushort *)(charsAscii + (value << 1)) : getCharIndex(value); byte *table = currentState + *(int *)(currentState + sizeof(int)); if (tableType == 0) { if ((index = *(table + index)) == 0) { return(-1); } currentState = State + index * 3 * sizeof(int); } else if (tableType == 1) { if ((index = (int)*(ushort *)(table + index * sizeof(ushort))) == 0) { return(-1); } currentState = State + index * 3 * sizeof(int); } else { if ((index = *(int *)(table + index * sizeof(int))) == 0) { return(-1); } currentState = State + index; } value = jsonDeSerializer.NextEnumChar(); }while (true); }
internal static void Array(JsonDeSerializer jsonDeSerializer, ref T[] values) { int count = ArrayIndex(jsonDeSerializer, ref values); if (count >= 0 && count != values.Length) { System.Array.Resize(ref values, count); } }
internal static void DeSerializeClass(JsonDeSerializer jsonDeSerializer, ref T value) { if (DefaultDeSerializer == null) { deSerializeClass(jsonDeSerializer, ref value); } else { DefaultDeSerializer(jsonDeSerializer, ref value); } }
internal static void DeSerializeValue(JsonDeSerializer jsonDeSerializer, ref T value) { if (jsonDeSerializer.SearchObject()) { DeSerializeMembers(jsonDeSerializer, ref value); } else { value = default(T); } }
internal static void DeSerializeStruct(JsonDeSerializer jsonDeSerializer, ref T value) { if (DefaultDeSerializer == null) { DeSerializeValue(jsonDeSerializer, ref value); } else { DefaultDeSerializer(jsonDeSerializer, ref value); } }
public void TestCatsListOfMaleOwnerWhenThereAreNoCats() { // Arrange string jsonData = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]}]"; var dependencies = GetTestDependencies(); dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); var result = dependencies.catStrategy.GetPetsOfMaleOwner(); Assert.AreEqual(0, result.Count); }
public void TestCatsListOfMaleOwnerWhenPetsIsNull() { // Arrange string jsonData = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":null}]"; var dependencies = GetTestDependencies(); dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); var result = dependencies.catStrategy.GetPetsOfMaleOwner(); Assert.AreEqual(0, result.Count); }
public void TestStrategyInstanceForCats() { // Arrange string jsonData = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null},{\"name\":\"Fred\",\"gender\":\"Male\",\"age\":40,\"pets\":[{\"name\":\"Tom\",\"type\":\"Cat\"},{\"name\":\"Max\",\"type\":\"Cat\"},{\"name\":\"Sam\",\"type\":\"Dog\"},{\"name\":\"Jim\",\"type\":\"Cat\"}]},{\"name\":\"Samantha\",\"gender\":\"Female\",\"age\":40,\"pets\":[{\"name\":\"Tabby\",\"type\":\"Cat\"}]},{\"name\":\"Alice\",\"gender\":\"Female\",\"age\":64,\"pets\":[{\"name\":\"Simba\",\"type\":\"Cat\"},{\"name\":\"Nemo\",\"type\":\"Fish\"}]}]"; var dependencies = GetTestDependencies(); dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); var expectedStrategy = new CatsStrategy(dependencies.petService, dependencies.inputData); var result = dependencies.petStrategyFactory.Resolve(PetType.Cat); Assert.AreEqual(JsonConvert.SerializeObject(expectedStrategy), JsonConvert.SerializeObject(result)); }
/// <summary> /// 获取成员转换函数信息 /// </summary> /// <param name="type">成员类型</param> /// <param name="isCustom"></param> /// <returns>成员转换函数信息</returns> internal static MethodInfo GetMemberMethodInfo(Type type, ref bool isCustom) { MethodInfo methodInfo = JsonDeSerializer.GetDeSerializeMethod(type); if (methodInfo != null) { return(methodInfo); } if (type.IsArray) { return(GenericType.Get(type.GetElementType()).JsonDeSerializeArrayMethod.Method); } if (type.IsEnum) { if (type.IsDefined(typeof(FlagsAttribute), false)) { return((EnumGenericType.Get(type).JsonDeSerializeEnumFlagsDelegate).Method); } return((EnumGenericType.Get(type).JsonDeSerializeEnumDelegate).Method); } if (type.IsGenericType) { Type genericType = type.GetGenericTypeDefinition(); if (genericType == typeof(Dictionary <,>)) { return(GenericType2.Get(type.GetGenericArguments()).JsonDeSerializeDictionaryMethod.Method); } if (genericType == typeof(Nullable <>)) { return(GetNullable(type).Method); } if (genericType == typeof(KeyValuePair <,>)) { return(GenericType2.Get(type.GetGenericArguments()).JsonDeSerializeKeyValuePairMethod.Method); } } if ((methodInfo = GetCustom(type)) != null) { isCustom = type.IsValueType; return(methodInfo); } if ((methodInfo = GetIEnumerableConstructor(type)) != null) { return(methodInfo); } if (type.IsValueType) { return(StructGenericType.Get(type).JsonDeSerializeStructMethod); } return(GenericType.Get(type).JsonDeSerializeTypeMethod); }
public void TestCatsCountOfMaleOwnerWhenThereIsMoreThanOneCat() { // Arrange string jsonData = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null},{\"name\":\"Fred\",\"gender\":\"Male\",\"age\":40,\"pets\":[{\"name\":\"Tom\",\"type\":\"Cat\"},{\"name\":\"Max\",\"type\":\"Cat\"},{\"name\":\"Sam\",\"type\":\"Dog\"},{\"name\":\"Jim\",\"type\":\"Cat\"}]},{\"name\":\"Samantha\",\"gender\":\"Female\",\"age\":40,\"pets\":[{\"name\":\"Tabby\",\"type\":\"Cat\"}]},{\"name\":\"Alice\",\"gender\":\"Female\",\"age\":64,\"pets\":[{\"name\":\"Simba\",\"type\":\"Cat\"},{\"name\":\"Nemo\",\"type\":\"Fish\"}]}]"; InputData inputData = new InputData(); inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); IPetService petService = new PetService(); var result = petService.GetPets(inputData, Gender.Male, PetType.Cat); Assert.AreEqual(4, result.Count); }
/// <summary> /// 数值解析 /// </summary> /// <param name="jsonDeSerializer"></param> /// <param name="value"></param> /// <returns></returns> private static bool tryDeSerializeNumber(JsonDeSerializer jsonDeSerializer, ref T value) { if (jsonDeSerializer.IsEnumNumberUnsigned()) { ulong intValue = 0; jsonDeSerializer.CallSerialize(ref intValue); value = AutoCSer.Metadata.EnumGenericType <T, ulong> .FromInt(intValue); } else if (jsonDeSerializer.DeSerializeState == DeSerializeState.Success) { return(false); } return(true); }
public void TestCatsCountOfFemaleOwnerWhenThereIsOnlyOneCat() { // Arrange string jsonData = "[{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]}]"; InputData inputData = new InputData(); inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); IPetService petService = new PetService(); var result = petService.GetPets(inputData, Gender.Female, PetType.Cat); Assert.AreEqual(1, result.Count); }
private TestDependencies GetTestDependencies() { string jsonData = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null}]}]"; InputData inputData = new InputData(); inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); IPetService petService = new PetService(); return(new TestDependencies { petService = petService, inputData = inputData }); }
public void TestThrowExceptionIfGenderIsInvalid() { string jsonData = "[{\"name\":\"Bob\",\"gender\":\"FMale\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]}]"; try { var result = JsonDeSerializer.FromJson(jsonData); Assert.Fail(); } catch (Exception ex) { Assert.IsTrue(ex is GenderIncorrectException); Assert.AreEqual(ex.Message, "Invalid Gender: FMale"); } }
public void TestThrowExceptionIfDataIsNull() { string jsonData = null; try { var result = JsonDeSerializer.FromJson(jsonData); Assert.Fail(); } catch (Exception ex) { Assert.IsTrue(ex is InputDataIncorrectException); Assert.AreEqual(ex.Message, "Data cannot be null or empty"); } }
/// <summary> /// 枚举值解析 /// </summary> /// <param name="jsonDeSerializer">JSON 反序列化</param> /// <param name="value">目标数据</param> protected static void deSerialize(JsonDeSerializer jsonDeSerializer, ref T value) { int index = enumSearcher.SearchString(jsonDeSerializer); if (index != -1) { value = enumValues[index]; } else if (jsonDeSerializer.Config.IsMatchEnum) { jsonDeSerializer.DeSerializeState = DeSerializeState.NoFoundEnumValue; } else if (jsonDeSerializer.DeSerializeState == DeSerializeState.Success) { jsonDeSerializer.SearchStringEnd(); } }
internal static void DeSerializeTcpServer(JsonDeSerializer deSerializer, ref T value) { if (DefaultDeSerializer == null) { if (deSerializer.SearchObject()) { DeSerializeMembers(deSerializer, ref value); } else { value = default(T); } } else { DefaultDeSerializer(deSerializer, ref value); } }
public void TestThrowExceptionOnRetrievingFish() { // Arrange string jsonData = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null},{\"name\":\"Fred\",\"gender\":\"Male\",\"age\":40,\"pets\":[{\"name\":\"Tom\",\"type\":\"Cat\"},{\"name\":\"Max\",\"type\":\"Cat\"},{\"name\":\"Sam\",\"type\":\"Dog\"},{\"name\":\"Jim\",\"type\":\"Cat\"}]},{\"name\":\"Samantha\",\"gender\":\"Female\",\"age\":40,\"pets\":[{\"name\":\"Tabby\",\"type\":\"Cat\"}]},{\"name\":\"Alice\",\"gender\":\"Female\",\"age\":64,\"pets\":[{\"name\":\"Simba\",\"type\":\"Cat\"},{\"name\":\"Nemo\",\"type\":\"Fish\"}]}]"; var dependencies = GetTestDependencies(); dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); try { var result = dependencies.petStrategyFactory.Resolve(PetType.Fish); Assert.Fail(); } catch (Exception ex) { Assert.IsTrue(ex is NotImplementedException); } }
/// <summary> /// 枚举值解析 /// </summary> /// <param name="jsonDeSerializer">JSON 反序列化</param> /// <param name="value">目标数据</param> public static void DeSerializeFlags(JsonDeSerializer jsonDeSerializer, ref T value) { if (!tryDeSerializeNumber(jsonDeSerializer, ref value)) { if (enumSearcher.State == null) { if (jsonDeSerializer.Config.IsMatchEnum) { jsonDeSerializer.DeSerializeState = DeSerializeState.NoFoundEnumValue; } else { jsonDeSerializer.Ignore(); } } else { int index, nextIndex = -1; getIndex(jsonDeSerializer, ref value, out index, ref nextIndex); if (nextIndex != -1) { ulong intValue = enumInts.ULong[index]; intValue |= enumInts.ULong[nextIndex]; while (jsonDeSerializer.Quote != 0) { index = enumSearcher.NextFlagEnum(jsonDeSerializer); if (jsonDeSerializer.DeSerializeState == DeSerializeState.Success) { if (index != -1) { intValue |= enumInts.ULong[index]; } } else { return; } } value = AutoCSer.Metadata.EnumGenericType <T, ulong> .FromInt(intValue); } } } }
public void TestCatsListOfFemaleOwnerWhenThereMoreThanOneCat_SortedAscending() { // Arrange string jsonData = "[{\"name\":\"Bob\",\"gender\":\"Male\",\"age\":23,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"},{\"name\":\"Fido\",\"type\":\"Dog\"}]},{\"name\":\"Jennifer\",\"gender\":\"Female\",\"age\":18,\"pets\":[{\"name\":\"Garfield\",\"type\":\"Cat\"}]},{\"name\":\"Steve\",\"gender\":\"Male\",\"age\":45,\"pets\":null},{\"name\":\"Fred\",\"gender\":\"Male\",\"age\":40,\"pets\":[{\"name\":\"Tom\",\"type\":\"Cat\"},{\"name\":\"Max\",\"type\":\"Cat\"},{\"name\":\"Sam\",\"type\":\"Dog\"},{\"name\":\"Jim\",\"type\":\"Cat\"}]},{\"name\":\"Samantha\",\"gender\":\"Female\",\"age\":40,\"pets\":[{\"name\":\"Tabby\",\"type\":\"Cat\"}]},{\"name\":\"Alice\",\"gender\":\"Female\",\"age\":64,\"pets\":[{\"name\":\"Simba\",\"type\":\"Cat\"},{\"name\":\"Nemo\",\"type\":\"Fish\"}]}]"; var dependencies = GetTestDependencies(); dependencies.inputData.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); var expectedOutput = new List <string> { "Garfield", "Simba", "Tabby" }; var result = dependencies.catStrategy.GetPetsOfFemaleOwner(); Assert.AreEqual(expectedOutput.Count, result.Count); Assert.AreEqual(expectedOutput[0], result[0]); Assert.AreEqual(expectedOutput[1], result[1]); Assert.AreEqual(expectedOutput[2], result[2]); }
public static void Main(string[] args) { HttpClientService httpClientService = new HttpClientService(); // Read data from Http Service string jsonData = httpClientService.Get(); // Deserialize json data InputData data = new InputData(); data.ownerAndTheirPets = JsonDeSerializer.FromJson(jsonData); if (data.ownerAndTheirPets != null) { // Get Pets of Pet types listed List <PetType> getPetsOfType = new List <PetType>() { PetType.Cat }; IPetService petService = new PetService(); OutputService outPutService = new OutputService(); var stratergyFactory = new PetStrategyFactory(petService, data); // Determine the strategy and get pets based on PetType and Owner Gender foreach (PetType petType in getPetsOfType) { var Strategy = stratergyFactory.Resolve(petType); List <string> maleOwnerPets = Strategy.GetPetsOfMaleOwner(); List <string> femaleOwnerCats = Strategy.GetPetsOfFemaleOwner(); outPutService.PrintOutput(petType, maleOwnerPets, femaleOwnerCats); } } else { Console.WriteLine("No data to process"); } Console.ReadKey(); }
/// <summary> /// 数组解析 /// </summary> /// <param name="jsonDeSerializer">Json解析器</param> /// <param name="array">目标数据</param> /// <returns>数据数量,-1表示失败</returns> internal static int ArrayIndex(JsonDeSerializer jsonDeSerializer, ref T[] array) { switch (jsonDeSerializer.SearchArray(ref array)) { case 0: array = new T[jsonDeSerializer.Config.NewArraySize]; int index = 0; do { if (index != array.Length) { DeSerialize(jsonDeSerializer, ref array[index]); if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return(-1); } ++index; } else { T value = default(T); DeSerialize(jsonDeSerializer, ref value); if (jsonDeSerializer.DeSerializeState != DeSerializeState.Success) { return(-1); } array = array.copyNew(index == 0 ? jsonDeSerializer.Config.NewArraySize : (index << 1)); array[index++] = value; } }while (jsonDeSerializer.IsNextArrayValue()); return(jsonDeSerializer.DeSerializeState == DeSerializeState.Success ? index : -1); case 1: return(0); default: return(-1); } }
static TypeDeSerializer() { Type type = typeof(T); MethodInfo methodInfo = JsonDeSerializer.GetDeSerializeMethod(type); if (methodInfo != null) { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>), methodInfo); return; } if (type.IsArray) { if (type.GetArrayRank() == 1) { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType.Get(type.GetElementType()).JsonDeSerializeArrayMethod; } else { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType.Get(type).JsonDeSerializeNotSupportDelegate; } return; } if (type.IsEnum) { if (type.IsDefined(typeof(FlagsAttribute), false)) { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)EnumGenericType.Get(type).JsonDeSerializeEnumFlagsDelegate; } else { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)EnumGenericType.Get(type).JsonDeSerializeEnumDelegate; } return; } if (type.isSerializeNotSupport()) { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType.Get(type).JsonDeSerializeNotSupportDelegate; return; } if (type.IsGenericType) { Type genericType = type.GetGenericTypeDefinition(); if (genericType == typeof(Dictionary <,>)) { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType2.Get(type.GetGenericArguments()).JsonDeSerializeDictionaryMethod; return; } if (genericType == typeof(Nullable <>)) { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)DeSerializeMethodCache.GetNullable(type); return; } if (genericType == typeof(KeyValuePair <,>)) { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)GenericType2.Get(type.GetGenericArguments()).JsonDeSerializeKeyValuePairMethod; isValueType = true; return; } } if ((methodInfo = DeSerializeMethodCache.GetCustom(type)) != null) { if (type.IsValueType) { #if NOJIT DefaultDeSerializer = new CustomDeSerializer(methodInfo).DeSerialize; #else DynamicMethod dynamicMethod = new DynamicMethod("CustomJsonDeSerializer", null, new Type[] { typeof(JsonDeSerializer), type.MakeByRefType() }, type, true); ILGenerator generator = dynamicMethod.GetILGenerator(); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldarg_0); generator.call(methodInfo); generator.Emit(OpCodes.Ret); DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)dynamicMethod.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>)); #endif } else { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>), methodInfo); } } else { Type attributeType; attribute = type.customAttribute <JsonDeSerializeAttribute>(out attributeType) ?? JsonDeSerializer.AllMemberAttribute; if ((methodInfo = DeSerializeMethodCache.GetIEnumerableConstructor(type)) != null) { DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>), methodInfo); } else { if (type.IsValueType) { isValueType = true; } else if (attribute != JsonDeSerializer.AllMemberAttribute && attributeType != type) { for (Type baseType = type.BaseType; baseType != typeof(object); baseType = baseType.BaseType) { JsonDeSerializeAttribute baseAttribute = baseType.customAttribute <JsonDeSerializeAttribute>(); if (baseAttribute != null) { if (baseAttribute.IsBaseType) { methodInfo = DeSerializeMethodCache.BaseDeSerializeMethod.MakeGenericMethod(baseType, type); DefaultDeSerializer = (JsonDeSerializer.DeSerializeDelegate <T>)Delegate.CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>), methodInfo); return; } break; } } } FieldIndex defaultMember = null; LeftArray <FieldIndex> fields = DeSerializeMethodCache.GetFields(MemberIndexGroup <T> .GetFields(attribute.MemberFilters), attribute, ref defaultMember); LeftArray <KeyValue <PropertyIndex, MethodInfo> > properties = DeSerializeMethodCache.GetProperties(MemberIndexGroup <T> .GetProperties(attribute.MemberFilters), attribute); bool isBox = false; if (type.IsValueType && fields.Length + properties.Length == 1) { BoxSerializeAttribute boxSerialize = AutoCSer.Metadata.TypeAttribute.GetAttribute <BoxSerializeAttribute>(type); if (boxSerialize != null && boxSerialize.IsJson) { isBox = true; defaultMember = null; } } TryDeSerializeFilter[] deSerializers = new TryDeSerializeFilter[fields.Length + properties.Length + (defaultMember == null ? 0 : 1)]; //memberMap.type memberMapType = memberMap<valueType>.TypeInfo; string[] names = isBox ? null : new string[deSerializers.Length]; #if !NOJIT DeSerializeDynamicMethod dynamicMethod = isBox ? default(DeSerializeDynamicMethod) : new DeSerializeDynamicMethod(type, false), memberMapDynamicMethod = isBox ? default(DeSerializeDynamicMethod) : new DeSerializeDynamicMethod(type, true); #endif int index = 0, nameLength = 0, maxNameLength = 0; foreach (FieldIndex member in fields) { TryDeSerializeFilter tryDeSerialize = deSerializers[index] = new TryDeSerializeFilter { #if NOJIT TryDeSerialize = new FieldDeSerializer(member.Member).DeSerializer(), #else TryDeSerialize = (JsonDeSerializer.DeSerializeDelegate <T>)DeSerializeMethodCache.CreateDynamicMethod(type, member.Member).CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>)), #endif MemberMapIndex = member.MemberIndex, //MemberFilters = member.Member.IsPublic ? Metadata.MemberFilters.PublicInstanceField : Metadata.MemberFilters.NonPublicInstanceField }; if (!isBox) { #if !NOJIT dynamicMethod.Push(member); memberMapDynamicMethod.Push(member); #endif string name = member.AnonymousName; if (name.Length > maxNameLength) { maxNameLength = name.Length; } nameLength += (names[index++] = name).Length; if (member == defaultMember) { deSerializers[deSerializers.Length - 1] = tryDeSerialize; names[deSerializers.Length - 1] = string.Empty; } } } foreach (KeyValue <PropertyIndex, MethodInfo> member in properties) { deSerializers[index] = new TryDeSerializeFilter { #if NOJIT TryDeSerialize = new PropertyDeSerializer(member.Key.Member).DeSerializer(), #else TryDeSerialize = (JsonDeSerializer.DeSerializeDelegate <T>)DeSerializeMethodCache.CreateDynamicMethod(type, member.Key.Member, member.Value).CreateDelegate(typeof(JsonDeSerializer.DeSerializeDelegate <T>)), #endif MemberMapIndex = member.Key.MemberIndex, //MemberFilters = member.Value.IsPublic ? Metadata.MemberFilters.PublicInstanceProperty : Metadata.MemberFilters.NonPublicInstanceProperty }; if (!isBox) { #if !NOJIT dynamicMethod.Push(member.Key, member.Value); memberMapDynamicMethod.Push(member.Key, member.Value); #endif if (member.Key.Member.Name.Length > maxNameLength) { maxNameLength = member.Key.Member.Name.Length; } nameLength += (names[index++] = member.Key.Member.Name).Length; } } if (isBox) { unboxDeSerializer = deSerializers[0].TryDeSerialize; DefaultDeSerializer = unbox; } else { #if !NOJIT deSerializeMember = (DeSerializeMember)dynamicMethod.Create <DeSerializeMember>(); deSerializeMemberMap = (DeSerializeMemberMap)memberMapDynamicMethod.Create <DeSerializeMemberMap>(); #endif if (type.Name[0] == '<') { isAnonymousType = true; } if (maxNameLength > (short.MaxValue >> 1) - 4 || nameLength == 0) { memberNames = Unmanaged.NullByte8; } else { memberNames = Unmanaged.GetStaticPointer((nameLength + (names.Length - (defaultMember == null ? 0 : 1)) * 5 + 1) << 1, false); byte *write = memberNames.Byte; foreach (string name in names) { if (name.Length != 0) { if (write == memberNames.Byte) { *(short *)write = (short)((name.Length + 3) * sizeof(char)); *(char *)(write + sizeof(short)) = '"'; write += sizeof(short) + sizeof(char); } else { *(short *)write = (short)((name.Length + 4) * sizeof(char)); *(int *)(write + sizeof(short)) = ',' + ('"' << 16); write += sizeof(short) + sizeof(int); } fixed(char *nameFixed = name) AutoCSer.Extensions.StringExtension.SimpleCopyNotNull(nameFixed, (char *)write, name.Length); *(int *)(write += name.Length << 1) = '"' + (':' << 16); write += sizeof(int); } } *(short *)write = 0; } memberSearcher = new StateSearcher(StateSearcher.GetMemberSearcher(type, names)); memberDeSerializers = deSerializers; Type refType = type.MakeByRefType(); foreach (AutoCSer.Metadata.AttributeMethod attributeMethod in AutoCSer.Metadata.AttributeMethod.GetStatic(type)) { if ((methodInfo = attributeMethod.Method).ReturnType == typeof(void)) { ParameterInfo[] parameters = methodInfo.GetParameters(); if (parameters.Length == 3 && parameters[0].ParameterType == typeof(JsonDeSerializer) && parameters[1].ParameterType == refType && parameters[2].ParameterType == Emit.Pub.PointerSizeRefType) { if (attributeMethod.GetAttribute <JsonDeSerializeUnknownNameAttriubte>() != null) { onUnknownName = (UnknownDeSerialize)Delegate.CreateDelegate(typeof(UnknownDeSerialize), methodInfo); break; } } } } } } } }
private void checkQuoteString() { Type = JsonDeSerializer.DeSerializeQuoteString(ref SubString, (int)(Int64 >> 32), (char)Int64, (int)Int64 >> 16) ? NodeType.String : NodeType.ErrorQuoteString; }
/// <summary> /// 输出字符串 /// </summary> /// <param name="charStream"></param> /// <param name="deSerializer"></param> private void toString(CharStream charStream, ref JsonDeSerializer deSerializer) { switch (Type) { case NodeType.String: case NodeType.NumberString: case NodeType.ErrorQuoteString: charStream.Write(ref SubString); return; case NodeType.QuoteString: if (deSerializer == null) { deSerializer = JsonDeSerializer.YieldPool.Default.Pop() ?? new JsonDeSerializer(); } if (!deSerializer.DeSerializeQuoteString(ref SubString, charStream, (int)(Int64 >> 32), (char)Int64)) { Type = NodeType.ErrorQuoteString; } return; case NodeType.NaN: charStream.WriteJsonNaN(); return; case NodeType.PositiveInfinity: charStream.WritePositiveInfinity(); return; case NodeType.NegativeInfinity: charStream.WriteNegativeInfinity(); return; case NodeType.DateTimeTick: new DateTime(Int64, DateTimeKind.Local).ToString(charStream); return; case NodeType.Bool: charStream.WriteJsonBool((int)Int64 != 0); return; case NodeType.Array: int count = (int)Int64; if (count == 0) { charStream.WriteJsonArray(); } int isNext = 0; charStream.Write('['); foreach (Node node in ListArray) { if (isNext == 0) { isNext = 1; } else { charStream.Write(','); } node.toString(charStream, ref deSerializer); if (--count == 0) { charStream.Write(']'); return; } } return; case NodeType.Dictionary: charStream.WriteJsonObjectString(); return; } }
public static DeSerializeResult fromJson <T>(this T value, string json, DeSerializeConfig config = null) { return(JsonDeSerializer.DeSerialize(json, ref value, config)); }