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("}"); }
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("}"); }
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("]"); } } }
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 WriteValue(Type value, JsonSerializerHandler handler) { if (value == null) { handler.WriteString("null"); } else { PrimitiveNormal.WriteValue(value.AssemblyQualifiedName, handler); } }
internal static void WriteValue(Uri value, JsonSerializerHandler handler) { if (value == null) { handler.Writer.Append("null"); } else { PrimitiveNormal.WriteValue(value.OriginalString, handler); } }
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("\""); } }
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("]"); }
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 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("}"); } }
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('"'); } }
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(); } }