Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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();
            }
        }
Exemple #3
0
        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("}");
        }
Exemple #4
0
        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();
            }
        }
Exemple #5
0
        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();
            }
        }