void WriteDataTableData(DataTable table) { OutputChar('"'); OutputText(table.TableName); OutputText("\":["); var cols = table.Columns; var rowseparator = false; var cl = cols.Count; var w = new WriteJsonValue[cl]; if (table.Rows.Count > 3) { for (int i = w.Length - 1; i >= 0; i--) { w[i] = GetWriteJsonMethod(cols[i].DataType); } } else { w = null; } foreach (DataRow row in table.Rows) { if (rowseparator) { OutputChar(','); } rowseparator = true; OutputChar('['); for (int j = 0; j < cl; j++) { if (j > 0) { OutputChar(','); } if (w != null) { w[j] (this, row[j]); } else { WriteValue(row[j]); } } OutputChar(']'); } OutputChar(']'); }
static WriteJsonValue[] RegisterMethods() { var r = new WriteJsonValue[Enum.GetNames(typeof(JsonDataType)).Length]; r[(int)JsonDataType.Array] = WriteArray; r[(int)JsonDataType.Bool] = WriteBoolean; r[(int)JsonDataType.ByteArray] = WriteByteArray; r[(int)JsonDataType.DataSet] = WriteDataSet; r[(int)JsonDataType.DataTable] = WriteDataTable; r[(int)JsonDataType.DateTime] = WriteDateTime; r[(int)JsonDataType.Dictionary] = WriteDictionary; r[(int)JsonDataType.Double] = WriteDouble; r[(int)JsonDataType.Enum] = WriteEnum; r[(int)JsonDataType.List] = WriteArray; r[(int)JsonDataType.Guid] = WriteGuid; r[(int)JsonDataType.Hashtable] = WriteDictionary; r[(int)JsonDataType.Int] = WriteInt32; r[(int)JsonDataType.Long] = WriteInt64; r[(int)JsonDataType.MultiDimensionalArray] = WriteMultiDimensionalArray; r[(int)JsonDataType.NameValue] = WriteNameValueCollection; r[(int)JsonDataType.Object] = WriteUnknown; r[(int)JsonDataType.Single] = WriteSingle; r[(int)JsonDataType.String] = WriteString; r[(int)JsonDataType.StringDictionary] = WriteStringDictionary; r[(int)JsonDataType.StringKeyDictionary] = WriteDictionary; r[(int)JsonDataType.TimeSpan] = WriteTimeSpan; r[(int)JsonDataType.Undefined] = WriteObject; return(r); }
MemberCache(MemberInfo memberInfo, Type memberType, string name) { MemberName = name; MemberType = memberType; MemberInfo = memberInfo; JsonDataType dt = Reflection.GetJsonDataType(memberType); DeserializeMethod = JsonDeserializer.GetReadJsonMethod(memberType); SerializeMethod = JsonSerializer.GetWriteJsonMethod(memberType); if (dt == JsonDataType.Array || dt == JsonDataType.MultiDimensionalArray) { ElementType = memberType.GetElementType(); } IsValueType = memberType.IsValueType; IsStruct = (IsValueType && !memberType.IsPrimitive && !memberType.IsEnum && typeof(decimal).Equals(memberType) == false); IsClass = memberType.IsClass; IsCollection = typeof(ICollection).IsAssignableFrom(memberType) && typeof(byte[]).Equals(memberType) == false; if (memberType.IsGenericType) { ElementType = memberType.GetGenericArguments()[0]; IsNullable = memberType.GetGenericTypeDefinition().Equals(typeof(Nullable <>)); } if (IsValueType) { ChangeType = IsNullable ? ElementType : memberType; } JsonDataType = dt; }
public JsonMemberGetter(SerializationInfo typeInfo, MemberCache member, SerializationManager manager) { Member = member; MemberName = member.MemberName; SerializedName = member.MemberName; SerializeMethod = JsonSerializer.GetWriteJsonMethod(member.MemberType); OwnerTypeInfo = typeInfo; TypeInfo = member.MemberInfo.ReflectedType.Equals(member.MemberType) ? typeInfo : manager.GetSerializationInfo(member.MemberType); }
/// <summary> /// Writes the JSON array representation from an <see cref="IDataReader"/> to the output <paramref name="target" />. /// </summary> /// <param name="data">The data to be serialized.</param> /// <param name="target">The output target.</param> /// <param name="manager">The <see cref="SerializationManager"/> to control advanced JSON serialization.</param> public static void WriteAsDataArray(this IDataReader data, TextWriter target, SerializationManager manager) { var js = new JsonSerializer(manager, target); target.Write(JsonSerializer.StartArray); var l = data.FieldCount; var fs = new WriteJsonValue[l]; for (int i = l - 1; i >= 0; i--) { fs[i] = manager.GetSerializationInfo(data.GetFieldType(i)).SerializeMethod; } var c = -1; object v; while (data.Read()) { if (++c > 0) { target.Write(JsonSerializer.Separator); } target.Write(JsonSerializer.StartArray); for (int i = 0; i < l; i++) { if (i > 0) { target.Write(JsonSerializer.Separator); } v = data.GetValue(i); if (v == null) { target.Write(JsonSerializer.Null); } else { fs[i] (js, v); } } target.Write(JsonSerializer.EndArray); } target.Write(JsonSerializer.EndArray); }
public SerializationInfo(ReflectionCache reflection) { Reflection = reflection; Constructor = reflection.Constructor; CommonType = reflection.CommonType; JsonDataType = reflection.JsonDataType; SerializeMethod = reflection.SerializeMethod; DeserializeMethod = reflection.DeserializeMethod; ItemDeserializeMethod = reflection.ItemDeserializer; AlwaysDeserializable = false; }
void WriteMultiDimensionalArray(WriteJsonValue m, Array md) { var r = md.Rank; var lb = new int[r]; var ub = new int[r]; var mdi = new int[r]; for (int i = 0; i < r; i++) { lb[i] = md.GetLowerBound(i); ub[i] = md.GetUpperBound(i) + 1; } Array.Copy(lb, 0, mdi, 0, r); WriteMultiDimensionalArray(m, md, r, lb, ub, mdi, 0); }
void WriteMultiDimensionalArray(WriteJsonValue m, Array array, int rank, int[] lowerBounds, int[] upperBounds, int[] indexes, int rankIndex) { var u = upperBounds[rankIndex]; if (rankIndex < rank - 1) { OutputChar('['); bool s = false; var d = rankIndex; do { if (s) { OutputChar(','); } Array.Copy(lowerBounds, d + 1, indexes, d + 1, rank - d - 1); WriteMultiDimensionalArray(m, array, rank, lowerBounds, upperBounds, indexes, ++d); d = rankIndex; s = true; } while (++indexes[rankIndex] < u); OutputChar(']'); } else if (rankIndex == rank - 1) { OutputChar('['); bool s = false; do { if (s) { OutputChar(','); } var v = array.GetValue(indexes); if (v == null || v is DBNull) { OutputText("null"); } else { m(this, v); } s = true; } while (++indexes[rankIndex] < u); OutputChar(']'); } }
internal ReflectionCache(Type type) { Type = type; TypeName = type.FullName; AssemblyName = type.AssemblyQualifiedName; JsonDataType = Reflection.GetJsonDataType(type); SerializeMethod = JsonSerializer.GetWriteJsonMethod(type); DeserializeMethod = JsonDeserializer.GetReadJsonMethod(type); if (JsonDataType == JsonDataType.Enum) { IsFlaggedEnum = AttributeHelper.HasAttribute <FlagsAttribute> (type, false); return; } if (type.IsArray) { ArgumentTypes = new Type[] { type.GetElementType() }; CommonType = type.GetArrayRank() == 1 ? ComplexType.Array : ComplexType.MultiDimensionalArray; } else { var t = type; if (t.IsGenericType == false) { while ((t = t.BaseType) != null) { if (t.IsGenericType) { break; } } } if (t != null) { ArgumentTypes = t.GetGenericArguments(); var gt = t.GetGenericTypeDefinition(); if (gt.Equals(typeof(Dictionary <,>))) { CommonType = ComplexType.Dictionary; } else if (gt.Equals(typeof(List <>))) { CommonType = ComplexType.List; } else if (gt.Equals(typeof(Nullable <>))) { CommonType = ComplexType.Nullable; SerializeMethod = JsonSerializer.GetWriteJsonMethod(ArgumentTypes[0]); } } } if (typeof(IEnumerable).IsAssignableFrom(type)) { if (typeof(Array).IsAssignableFrom(type) == false) { AppendItem = Reflection.CreateWrapperMethod <AddCollectionItem> (Reflection.FindMethod(type, "Add", new Type[1] { null })); } if (ArgumentTypes != null && ArgumentTypes.Length == 1) { ItemSerializer = JsonSerializer.GetWriteJsonMethod(ArgumentTypes[0]); ItemDeserializer = JsonDeserializer.GetReadJsonMethod(ArgumentTypes[0]); } } if (ArgumentTypes != null) { ArgumentReflections = new ReflectionCache[ArgumentTypes.Length]; } if (CommonType != ComplexType.Array && CommonType != ComplexType.MultiDimensionalArray && CommonType != ComplexType.Nullable) { var t = type; if (type.IsNested == false && type.IsPublic == false) { ConstructorInfo |= ConstructorTypes.NonPublic; } else { while (t != null && t.IsNested) { if (t.IsNestedPublic == false) { ConstructorInfo |= ConstructorTypes.NonPublic; } t = t.DeclaringType; } } if (type.IsClass || type.IsValueType) { Constructor = Reflection.CreateConstructorMethod(type, type.IsVisible == false || typeof(DatasetSchema).Equals(type)); if (Constructor != null && Constructor.Method.IsPublic == false) { ConstructorInfo |= ConstructorTypes.NonPublic; } if (Constructor == null) { var c = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); if (c != null && c.Length > 0) { ConstructorInfo |= ConstructorTypes.Parametric; } } Members = Reflection.GetMembers(type); } } //if (typeof (IEnumerable).IsAssignableFrom (type)) { // return; //} //if (JsonDataType != JsonDataType.Undefined) { // return; //} }
void WriteMultiDimensionalArray(WriteJsonValue m, Array array, int rank, int[] lowerBounds, int[] upperBounds, int[] indexes, int rankIndex) { var u = upperBounds[rankIndex]; if (rankIndex < rank - 1) { _output.Append ('['); bool s = false; var d = rankIndex; do { if (s) { _output.Append (','); } Array.Copy (lowerBounds, d + 1, indexes, d + 1, rank - d - 1); WriteMultiDimensionalArray (m, array, rank, lowerBounds, upperBounds, indexes, ++d); d = rankIndex; s = true; } while (++indexes[rankIndex] < u); _output.Append (']'); } else if (rankIndex == rank - 1) { _output.Append ('['); bool s = false; do { if (s) { _output.Append (','); } var v = array.GetValue (indexes); if (v == null || v is DBNull) { _output.Append ("null"); } else { m (this, v); } s = true; } while (++indexes[rankIndex] < u); _output.Append (']'); } }
void WriteMultiDimensionalArray(WriteJsonValue m, Array md) { var r = md.Rank; var lb = new int[r]; var ub = new int[r]; var mdi = new int[r]; for (int i = 0; i < r; i++) { lb[i] = md.GetLowerBound (i); ub[i] = md.GetUpperBound (i) + 1; } Array.Copy (lb, 0, mdi, 0, r); WriteMultiDimensionalArray (m, md, r, lb, ub, mdi, 0); }
static WriteJsonValue[] RegisterMethods() { var r = new WriteJsonValue[Enum.GetNames (typeof (JsonDataType)).Length]; r[(int)JsonDataType.Array] = WriteArray; r[(int)JsonDataType.Bool] = WriteBoolean; r[(int)JsonDataType.ByteArray] = WriteByteArray; r[(int)JsonDataType.Custom] = WriteCustom; r[(int)JsonDataType.DataSet] = WriteDataSet; r[(int)JsonDataType.DataTable] = WriteDataTable; r[(int)JsonDataType.DateTime] = WriteDateTime; r[(int)JsonDataType.Dictionary] = WriteDictionary; r[(int)JsonDataType.Double] = WriteDouble; r[(int)JsonDataType.Enum] = WriteEnum; r[(int)JsonDataType.List] = WriteArray; r[(int)JsonDataType.Guid] = WriteGuid; r[(int)JsonDataType.Hashtable] = WriteDictionary; r[(int)JsonDataType.Int] = WriteInt32; r[(int)JsonDataType.Long] = WriteInt64; r[(int)JsonDataType.MultiDimensionalArray] = WriteMultiDimensionalArray; r[(int)JsonDataType.NameValue] = WriteNameValueCollection; r[(int)JsonDataType.Object] = WriteUnknown; r[(int)JsonDataType.Single] = WriteSingle; r[(int)JsonDataType.String] = WriteString; r[(int)JsonDataType.StringDictionary] = WriteStringDictionary; r[(int)JsonDataType.StringKeyDictionary] = WriteDictionary; r[(int)JsonDataType.TimeSpan] = WriteTimeSpan; r[(int)JsonDataType.Undefined] = WriteObject; return r; }
void WriteDataTableData(DataTable table) { _output.Append ('\"'); _output.Append (table.TableName); _output.Append ("\":["); var cols = table.Columns; var rowseparator = false; var cl = cols.Count; var w = new WriteJsonValue[cl]; if (table.Rows.Count > 3) { for (int i = w.Length - 1; i >= 0; i--) { w[i] = GetWriteJsonMethod (cols[i].DataType); } } else { w = null; } foreach (DataRow row in table.Rows) { if (rowseparator) _output.Append (','); rowseparator = true; _output.Append ('['); for (int j = 0; j < cl; j++) { if (j > 0) { _output.Append (','); } if (w != null) { w[j] (this, row[j]); } else { WriteValue (row[j]); } } _output.Append (']'); } _output.Append (']'); }
internal ReflectionCache(Type type) { Type = type; TypeName = type.FullName; AssemblyName = type.AssemblyQualifiedName; JsonDataType = Reflection.GetJsonDataType (type); SerializeMethod = JsonSerializer.GetWriteJsonMethod (type); DeserializeMethod = JsonDeserializer.GetReadJsonMethod (type); if (JsonDataType == JsonDataType.Enum) { IsFlaggedEnum = AttributeHelper.HasAttribute<FlagsAttribute> (type, false); return; } if (type.IsArray) { ArgumentTypes = new Type[] { type.GetElementType () }; CommonType = type.GetArrayRank () == 1 ? ComplexType.Array : ComplexType.MultiDimensionalArray; } else { var t = type; if (t.IsGenericType == false) { while ((t = t.BaseType) != null) { if (t.IsGenericType) { break; } } } if (t != null) { ArgumentTypes = t.GetGenericArguments (); var gt = t.GetGenericTypeDefinition (); if (gt.Equals (typeof (Dictionary<,>))) { CommonType = ComplexType.Dictionary; } else if (gt.Equals (typeof (List<>))) { CommonType = ComplexType.List; } else if (gt.Equals (typeof (Nullable<>))) { CommonType = ComplexType.Nullable; SerializeMethod = JsonSerializer.GetWriteJsonMethod (ArgumentTypes[0]); } } } if (typeof(IEnumerable).IsAssignableFrom (type)) { if (typeof(Array).IsAssignableFrom (type) == false) { AppendItem = Reflection.CreateWrapperMethod<AddCollectionItem> (Reflection.FindMethod (type, "Add", new Type[1] { null })); } if (ArgumentTypes != null && ArgumentTypes.Length == 1) { ItemSerializer = JsonSerializer.GetWriteJsonMethod (ArgumentTypes[0]); ItemDeserializer = JsonDeserializer.GetReadJsonMethod (ArgumentTypes[0]); } } if (ArgumentTypes != null) { ArgumentReflections = new ReflectionCache[ArgumentTypes.Length]; } if (CommonType != ComplexType.Array && CommonType != ComplexType.MultiDimensionalArray && CommonType != ComplexType.Nullable) { var t = type; if (type.IsNested == false && type.IsPublic == false) { ConstructorInfo |= ConstructorTypes.NonPublic; } else { while (t != null && t.IsNested) { if (t.IsNestedPublic == false) { ConstructorInfo |= ConstructorTypes.NonPublic; } t = t.DeclaringType; } } if (type.IsClass || type.IsValueType) { Constructor = Reflection.CreateConstructorMethod (type, type.IsVisible == false || typeof (DatasetSchema).Equals (type)); if (Constructor != null && Constructor.Method.IsPublic == false) { ConstructorInfo |= ConstructorTypes.NonPublic; } if (Constructor == null) { var c = type.GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); if (c != null && c.Length > 0) { ConstructorInfo |= ConstructorTypes.Parametric; } } Members = Reflection.GetMembers (type); } } //if (typeof (IEnumerable).IsAssignableFrom (type)) { // return; //} //if (JsonDataType != JsonDataType.Undefined) { // return; //} }
MemberCache(MemberInfo memberInfo, Type memberType, string name) { MemberName = name; MemberType = memberType; MemberInfo = memberInfo; JsonDataType dt = Reflection.GetJsonDataType (memberType); DeserializeMethod = JsonDeserializer.GetReadJsonMethod (memberType); SerializeMethod = JsonSerializer.GetWriteJsonMethod (memberType); if (dt == JsonDataType.Array || dt == JsonDataType.MultiDimensionalArray) { ElementType = memberType.GetElementType (); } IsValueType = memberType.IsValueType; IsStruct = (IsValueType && !memberType.IsPrimitive && !memberType.IsEnum && typeof (decimal).Equals (memberType) == false); IsClass = memberType.IsClass; IsCollection = typeof (ICollection).IsAssignableFrom (memberType) && typeof (byte[]).Equals (memberType) == false; if (memberType.IsGenericType) { ElementType = memberType.GetGenericArguments ()[0]; IsNullable = memberType.GetGenericTypeDefinition ().Equals (typeof (Nullable<>)); } if (IsValueType) { ChangeType = IsNullable ? ElementType : memberType; } JsonDataType = dt; }