internal static void WriteMultidimensionalArray(Array value, JsonSerializerHandler handler) { if (handler.Option.ReferenceLoopHandling != JsonReferenceHandlingEnum.None) { if (handler.SerializeStacks.Contains(value)) { if (handler.Option.ReferenceLoopHandling == JsonReferenceHandlingEnum.Null) { handler.Writer.Append("null"); } else if (handler.Option.ReferenceLoopHandling == JsonReferenceHandlingEnum.Empty) { handler.Writer.Append("[]"); } else if (handler.Option.ReferenceLoopHandling == JsonReferenceHandlingEnum.Remove) { RemoveWriterHelper.RemoveArrayItem(handler.Writer); } return; } handler.SerializeStacks.Push(value); } var action = SerializerObjectJump.GetThreadSafetyJumpAction(value.GetType().GetElementType()); handler.Writer.Append("["); var enumerator = value.GetEnumerator(); MultidimensionalWrite(enumerator, handler, value, action, value.GetLength(0), 0); handler.Writer.Append("]"); if (handler.Option.ReferenceLoopHandling != JsonReferenceHandlingEnum.None) { handler.SerializeStacks.Pop(); } }
internal static void WriteDynamic(object value, JsonSerializerHandler handler) { if (value == null) { handler.Writer.Append("null"); return; } if (handler.Option.ReferenceLoopHandling != JsonReferenceHandlingEnum.None) { if (handler.SerializeStacks.Contains(value)) { if (handler.Option.ReferenceLoopHandling == JsonReferenceHandlingEnum.Null) { handler.Writer.Append("null"); } else if (handler.Option.ReferenceLoopHandling == JsonReferenceHandlingEnum.Empty) { handler.Writer.Append("{}"); } else if (handler.Option.ReferenceLoopHandling == JsonReferenceHandlingEnum.Remove) { RemoveWriterHelper.RemoveDictionaryKey(handler.Writer); } return; } handler.SerializeStacks.Push(value); } var t = value.GetType(); handler.Writer.Append("{"); bool isFirst = true; foreach (var item in t.GetProperties()) { if (isFirst) { isFirst = false; } else { handler.Writer.Append(","); } handler.Writer.Append("\""); handler.Writer.Append(item.Name); handler.Writer.Append("\""); handler.Writer.Append(":"); SerializerObjectJump.GetThreadSafetyJumpAction(item.PropertyType)(item.GetValue(value), handler); } handler.Writer.Append("}"); }
internal static void WriteValue(object obj, JsonSerializerHandler handler) { if (obj == null) { handler.Writer.Append("null"); return; } var type = obj.GetType(); if (type.IsAnonymousType() || type == typeof(object)) { SpecialConditions.WriteDynamic(obj, handler); } else { var jumpAction = SerializerObjectJump.GetThreadSafetyJumpAction(type); jumpAction(obj, handler); } }
internal static void WriteDictionary(IDictionary value, JsonSerializerHandler handler) { if (value == null) { handler.Writer.Append("null"); return; } var t = value.GetType(); if (t.IsGenericType) { var serializerAction = SerializerObjectJump.GetThreadSafetyJumpAction(t); serializerAction(value, handler); } else { WriteIDictionary(value, handler); } }
internal static void WriteCollection(IEnumerable value, JsonSerializerHandler handler) { if (value == null) { handler.Writer.Append("null"); return; } var t = value.GetType(); if (t.IsGenericType) { var serializerAction = SerializerObjectJump.GetThreadSafetyJumpAction(t); serializerAction(value, handler); } else { bool isMultidimensionalArray = false; Array ary = null; if (t.IsArray) { ary = (Array)value; if (ary.Rank > 1) { isMultidimensionalArray = true; } } if (isMultidimensionalArray) { WriteMultidimensionalArray(ary, handler); } else { WriteIEnumerable(value, handler); } } }