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 WriteValue(ExpandoObject 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); } IDictionary <string, object> keyValuePairs = value; handler.Writer.Append("{"); bool isFirst = true; foreach (var item in value) { if (isFirst) { isFirst = false; } else { handler.Writer.Append(","); } PrimitiveNormal.WriteValue(item.Key, handler); handler.Writer.Append(":"); var val = item.Value; PrimitiveNormal.WriteValue(val, handler); } 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 WriteIEnumerable(IEnumerable 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); } handler.Writer.Append("["); bool isFirst = true; foreach (var obj in value) { if (isFirst) { isFirst = false; } else { handler.Writer.Append(","); } PrimitiveNormal.WriteValue(obj, handler); } handler.Writer.Append("]"); if (handler.Option.ReferenceLoopHandling != JsonReferenceHandlingEnum.None) { handler.SerializeStacks.Pop(); } }
internal static void WriteIDictionary(IDictionary 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.RemoveDictionaryKey(handler.Writer); } return; } handler.SerializeStacks.Push(value); } bool isFirst = true; handler.Writer.Append("{"); foreach (DictionaryEntry item in value) { var keyType = item.Key.GetType(); if (keyType.IsWrongKey()) { continue; } if (isFirst) { isFirst = false; } else { handler.Writer.Append(","); } if (keyType.IsPrimitive || (keyType.IsEnum && handler.Option.IsEnumNum))//string,primitive,enum,guid,datetime { handler.Writer.Append("\""); } PrimitiveNormal.WriteValue(item.Key, handler); if (keyType.IsPrimitive || (keyType.IsEnum && handler.Option.IsEnumNum)) { handler.Writer.Append("\""); } handler.Writer.Append(":"); PrimitiveNormal.WriteValue(item.Value, handler); } handler.Writer.Append("}"); if (handler.Option.ReferenceLoopHandling != JsonReferenceHandlingEnum.None) { handler.SerializeStacks.Pop(); } }