示例#1
0
        internal static void WriteValue(NameValueCollection value, JsonSerializerHandler handler)
        {
            if (value == null)
            {
                handler.Writer.Append("null");
                return;
            }
            handler.Writer.Append("{");
            bool isFirst = true;

            foreach (string item in value)
            {
                if (isFirst)
                {
                    isFirst = false;
                }
                else
                {
                    handler.Writer.Append(",");
                }
                var name = item;
                PrimitiveNormal.WriteValue(name, handler);
                handler.Writer.Append(":");
                var val = value[name];
                PrimitiveNormal.WriteValue(val, handler);
            }
            handler.Writer.Append("}");
        }
示例#2
0
        internal static void WriteValue(StringDictionary value, JsonSerializerHandler handler)
        {
            if (value == null)
            {
                handler.Writer.Append("null");
                return;
            }
            handler.Writer.Append("{");
            bool isFirst = true;

            foreach (DictionaryEntry item in value)
            {
                if (isFirst)
                {
                    isFirst = false;
                }
                else
                {
                    handler.Writer.Append(",");
                }
                var name = item.Key;
                PrimitiveNormal.WriteValue(item.Key, handler);
                handler.Writer.Append(":");
                var val = item.Value;
                PrimitiveNormal.WriteValue(val, handler);
            }
            handler.Writer.Append("}");
        }
示例#3
0
 internal static void WriteValue(byte[] value, JsonSerializerHandler handler)
 {
     if (value == null)
     {
         handler.Writer.Append("null");
     }
     else
     {
         if (handler.Option.IsByteArrayFormatBase64)
         {
             handler.Writer.Append("\"");
             handler.Writer.Append(Convert.ToBase64String(value));
             handler.Writer.Append("\"");
         }
         else
         {
             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("]");
         }
     }
 }
示例#4
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();
            }
        }
示例#5
0
 internal static void WriteValue(Type value, JsonSerializerHandler handler)
 {
     if (value == null)
     {
         handler.WriteString("null");
     }
     else
     {
         PrimitiveNormal.WriteValue(value.AssemblyQualifiedName, handler);
     }
 }
示例#6
0
 internal static void WriteValue(Uri value, JsonSerializerHandler handler)
 {
     if (value == null)
     {
         handler.Writer.Append("null");
     }
     else
     {
         PrimitiveNormal.WriteValue(value.OriginalString, handler);
     }
 }
示例#7
0
 internal static void WriteEnum(Enum value, JsonSerializerHandler handler)
 {
     if (handler.Option.IsEnumNum)
     {
         PrimitiveNormal.WriteValue(value.GetHashCode(), handler);
     }
     else
     {
         handler.Writer.Append("\"");
         handler.Writer.Append(value.ToString());
         handler.Writer.Append("\"");
     }
 }
示例#8
0
        internal static void WriteValue(DataTable value, JsonSerializerHandler handler)
        {
            if (value == null)
            {
                handler.Writer.Append("null");
                return;
            }
            handler.Writer.Append("[");

            bool isFirst = true;

            foreach (DataRow row in value.Rows)
            {
                if (isFirst)
                {
                    isFirst = false;
                }
                else
                {
                    handler.Writer.Append(",");
                }

                handler.Writer.Append("{");
                bool isFirst2 = true;
                foreach (DataColumn column in row.Table.Columns)
                {
                    if (isFirst2)
                    {
                        isFirst2 = false;
                    }
                    else
                    {
                        handler.Writer.Append(",");
                    }

                    object columnValue = row[column];
                    handler.Writer.Append("\"");
                    handler.Writer.Append(column.ColumnName);//没有检查
                    handler.Writer.Append("\":");
                    PrimitiveNormal.WriteValue(columnValue, handler);
                }
                handler.Writer.Append("}");
            }

            handler.Writer.Append("]");
        }
示例#9
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();
            }
        }
示例#10
0
 internal static void WriteValue(Exception value, JsonSerializerHandler handler)
 {
     if (value == null)
     {
         handler.WriteString("null");
     }
     else
     {
         handler.WriteString("{\"Message\":");
         PrimitiveNormal.WriteValue(value.Message, handler);
         handler.WriteString(",\"Source\":");
         PrimitiveNormal.WriteValue(value.Source, handler);
         handler.WriteString(",\"StackTrace\":");
         PrimitiveNormal.WriteValue(value.StackTrace, handler);
         handler.WriteString(",\"HelpLink\":");
         PrimitiveNormal.WriteValue(value.HelpLink, handler);
         handler.WriteString("}");
     }
 }
示例#11
0
        internal static void WriteValue(TimeSpan value, JsonSerializerHandler handler)
        {
            if (handler.Option.TimespanFormat == TimespanFormatEnum.ISO8601)
            {
                // can't negate this, have to handle it manually
                if (value.Ticks == long.MinValue)
                {
                    handler.Writer.Append("\"-P10675199DT2H48M5.4775808S\"");
                    return;
                }
                char[] buffer = new char[36];
                handler.Writer.Append('"');

                if (value.Ticks < 0)
                {
                    handler.Writer.Append('-');
                    value = value.Negate();
                }

                handler.Writer.Append('P');

                var days    = value.Days;
                var hours   = value.Hours;
                var minutes = value.Minutes;
                var seconds = value.Seconds;

                // days
                if (days > 0)
                {
                    _CustomWriteIntUnrolledSigned(handler.Writer, days, buffer);
                    handler.Writer.Append('D');
                }

                // time separator
                handler.Writer.Append('T');

                // hours
                if (hours > 0)
                {
                    _CustomWriteIntUnrolledSigned(handler.Writer, hours, buffer);
                    handler.Writer.Append('H');
                }

                // minutes
                if (minutes > 0)
                {
                    _CustomWriteIntUnrolledSigned(handler.Writer, minutes, buffer);
                    handler.Writer.Append('M');
                }

                // seconds
                _CustomWriteIntUnrolledSigned(handler.Writer, seconds, buffer);

                // fractional part
                {
                    var endCount       = 0;
                    var remainingTicks = (value - new TimeSpan(days, hours, minutes, seconds, 0)).Ticks;

                    if (remainingTicks > 0)
                    {
                        int fracEnd;

                        buffer[0] = '.';

                        var fracPart = remainingTicks % 100;
                        remainingTicks /= 100;

                        TwoDigits digits;
                        if (fracPart > 0)
                        {
                            digits    = DigitPairs[fracPart];
                            buffer[7] = digits.Second;
                            buffer[6] = digits.First;
                            fracEnd   = 8;
                        }
                        else
                        {
                            fracEnd = 6;
                        }

                        fracPart        = remainingTicks % 100;
                        remainingTicks /= 100;
                        if (fracPart > 0)
                        {
                            digits    = DigitPairs[fracPart];
                            buffer[5] = digits.Second;
                            buffer[4] = digits.First;
                        }
                        else
                        {
                            if (fracEnd == 6)
                            {
                                fracEnd = 4;
                            }
                            else
                            {
                                buffer[5] = '0';
                                buffer[4] = '0';
                            }
                        }

                        fracPart        = remainingTicks % 100;
                        remainingTicks /= 100;
                        if (fracPart > 0)
                        {
                            digits    = DigitPairs[fracPart];
                            buffer[3] = digits.Second;
                            buffer[2] = digits.First;
                        }
                        else
                        {
                            if (fracEnd == 4)
                            {
                                fracEnd = 2;
                            }
                            else
                            {
                                buffer[3] = '0';
                                buffer[2] = '0';
                            }
                        }

                        fracPart  = remainingTicks;
                        buffer[1] = (char)('0' + fracPart);

                        endCount = fracEnd;
                    }

                    handler.Writer.Append(buffer, 0, endCount);
                }

                handler.Writer.Append("S\"");
            }
            else
            {
                if (value.Ticks == long.MinValue)
                {
                    handler.Writer.Append("\"-10675199.02:48:05.4775808\"");
                    return;
                }
                char[] buffer = new char[36];
                handler.Writer.Append('"');

                if (value.Ticks < 0)
                {
                    handler.Writer.Append('-');
                    value = value.Negate();
                }

                var days    = value.Days;
                var hours   = value.Hours;
                var minutes = value.Minutes;
                var secs    = value.Seconds;

                TwoDigits digits;

                // days
                {
                    if (days != 0)
                    {
                        PrimitiveNormal.WriteValue(days, handler);
                        handler.Writer.Append('.');
                    }
                }

                // hours
                {
                    digits    = DigitPairs[hours];
                    buffer[0] = digits.First;
                    buffer[1] = digits.Second;
                }

                buffer[2] = ':';

                // minutes
                {
                    digits    = DigitPairs[minutes];
                    buffer[3] = digits.First;
                    buffer[4] = digits.Second;
                }

                buffer[5] = ':';

                // seconds
                {
                    digits    = DigitPairs[secs];
                    buffer[6] = digits.First;
                    buffer[7] = digits.Second;
                }

                int endCount = 8;

                // factional part
                {
                    var remainingTicks = (value - new TimeSpan(value.Days, value.Hours, value.Minutes, value.Seconds, 0)).Ticks;
                    if (remainingTicks > 0)
                    {
                        int fracEnd;

                        buffer[8] = '.';

                        var fracPart = remainingTicks % 100;
                        remainingTicks /= 100;
                        if (fracPart > 0)
                        {
                            digits     = DigitPairs[fracPart];
                            buffer[15] = digits.Second;
                            buffer[14] = digits.First;
                            fracEnd    = 16;
                        }
                        else
                        {
                            fracEnd = 14;
                        }

                        fracPart        = remainingTicks % 100;
                        remainingTicks /= 100;
                        if (fracPart > 0)
                        {
                            digits     = DigitPairs[fracPart];
                            buffer[13] = digits.Second;
                            buffer[12] = digits.First;
                        }
                        else
                        {
                            if (fracEnd == 14)
                            {
                                fracEnd = 12;
                            }
                            else
                            {
                                buffer[13] = '0';
                                buffer[12] = '0';
                            }
                        }

                        fracPart        = remainingTicks % 100;
                        remainingTicks /= 100;
                        if (fracPart > 0)
                        {
                            digits     = DigitPairs[fracPart];
                            buffer[11] = digits.Second;
                            buffer[10] = digits.First;
                        }
                        else
                        {
                            if (fracEnd == 12)
                            {
                                fracEnd = 10;
                            }
                            else
                            {
                                buffer[11] = '0';
                                buffer[10] = '0';
                            }
                        }

                        fracPart  = remainingTicks;
                        buffer[9] = (char)('0' + fracPart);

                        endCount = fracEnd;
                    }
                }

                handler.Writer.Append(buffer, 0, endCount);

                handler.Writer.Append('"');
            }
        }
示例#12
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();
            }
        }