/// <summary> /// Adds an <see cref="Exception" /> JSON converter to the list. /// </summary> /// <param name="converters">The list of JSON converters.</param> /// <param name="includeStackTraceFactory">The function delegate that is invoked when it is needed to determine whether the stack of an exception is included in the converted result.</param> public static void AddExceptionConverter(this ICollection <JsonConverter> converters, Func <bool> includeStackTraceFactory) { converters.Add(DynamicJsonConverter.Create <Exception>((writer, exception) => { WriteException(writer, exception, includeStackTraceFactory?.Invoke() ?? false); })); }
/// <summary> /// Adds a <see cref="TimeSpan"/> JSON converter to the list. /// </summary> /// <param name="converters">The list of JSON converters.</param> public static void AddTimeSpanConverter(this ICollection <JsonConverter> converters) { converters.Add(DynamicJsonConverter.Create((writer, ts) => { writer.WriteStartObject(); writer.WritePropertyName("ticks", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.Ticks); writer.WritePropertyName("days", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.Days); writer.WritePropertyName("hours", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.Hours); writer.WritePropertyName("minutes", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.Minutes); writer.WritePropertyName("seconds", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.Seconds); writer.WritePropertyName("totalDays", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.TotalDays); writer.WritePropertyName("totalHours", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.TotalHours); writer.WritePropertyName("totalMilliseconds", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.TotalMilliseconds); writer.WritePropertyName("totalMinutes", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.TotalMinutes); writer.WritePropertyName("totalSeconds", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(ts.TotalSeconds); writer.WriteEndObject(); }, (reader, ts) => reader.ToHierarchy().UseTimeSpanFormatter())); }
/// <summary> /// Serializes the specified <paramref name="source"/> to an object of <see cref="string"/>. /// </summary> /// <param name="source">The object to serialize to JSON format.</param> /// <param name="sourceType">The type of the object to serialize.</param> /// <returns>A string of the serialized <paramref name="source"/>.</returns> /// <remarks>This method will serialize, in the order specified, using one of either:<br/> /// 1. the explicitly defined <see cref="JsonFormatterOptions.WriterFormatter"/> delegate<br/> /// 2. the implicit or explicit defined delegate in <see cref="JsonFormatterOptions.WriterFormatters"/> dictionary<br/> /// 3. if neither was specified, a default JSON writer implementation will be used on <see cref="JsonConverter"/>. /// </remarks> public override Stream Serialize(object source, Type sourceType) { Validator.ThrowIfNull(source, nameof(source)); Validator.ThrowIfNull(sourceType, nameof(sourceType)); var converter = Options.Converter; if (converter == null) { var formatter = Options.ParseWriterFormatter(sourceType); converter = DynamicJsonConverter.Create(sourceType, Options.Settings, formatter); } var serializer = JsonSerializer.Create(Options.Settings); // there is a bug in the JsonConvert.SerializeObject, why we had to make our own implementation serializer.Converters.Add(converter); return(StreamWriterUtility.CreateStream(writer => { using (JsonTextWriter jsonWriter = new JsonTextWriter(writer)) { jsonWriter.CloseOutput = false; jsonWriter.Formatting = serializer.Formatting; serializer.Serialize(jsonWriter, source, sourceType); } })); }
/// <summary> /// Adds an <see cref="HttpExceptionDescriptor"/> JSON converter to the list. /// </summary> /// <param name="converters">The list of JSON converters.</param> /// <param name="setup">The <see cref="ExceptionDescriptorSerializationOptions"/> which need to be configured.</param> public static void AddHttpExceptionDescriptorConverter(this ICollection <JsonConverter> converters, Action <ExceptionDescriptorSerializationOptions> setup = null) { var options = setup.ConfigureOptions(); converters.Add(DynamicJsonConverter.Create <HttpExceptionDescriptor>((writer, descriptor) => { writer.WriteStartObject(); writer.WritePropertyName("error", () => DynamicJsonConverter.UseCamelCase); writer.WriteStartObject(); writer.WritePropertyName("status", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(descriptor.StatusCode); writer.WritePropertyName("code", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(descriptor.Code); writer.WritePropertyName("message", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(descriptor.Message); if (descriptor.HelpLink != null) { writer.WritePropertyName("helpLink", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(descriptor.HelpLink.OriginalString); } if (options.IncludeFailure) { writer.WritePropertyName("failure", () => DynamicJsonConverter.UseCamelCase); writer.WriteObject(descriptor.Failure); } writer.WriteEndObject(); if (options.IncludeEvidence && descriptor.Evidence.Any()) { writer.WritePropertyName("evidence", () => DynamicJsonConverter.UseCamelCase); writer.WriteStartObject(); foreach (var evidence in descriptor.Evidence) { writer.WritePropertyName(evidence.Key, () => DynamicJsonConverter.UseCamelCase); writer.WriteObject(evidence.Value); } writer.WriteEndObject(); } if (!descriptor.CorrelationId.IsNullOrWhiteSpace()) { writer.WritePropertyName("correlationId", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(descriptor.CorrelationId); } if (!descriptor.RequestId.IsNullOrWhiteSpace()) { writer.WritePropertyName("requestId", () => DynamicJsonConverter.UseCamelCase); writer.WriteValue(descriptor.RequestId); } writer.WriteEndObject(); })); }
/// <summary> /// Adds an <see cref="DataPair" /> JSON converter to the list. /// </summary> /// <param name="converters">The list of JSON converters.</param> public static void AddDataPairConverter(this ICollection <JsonConverter> converters) { converters.Add(DynamicJsonConverter.Create <DataPair>((writer, dp) => { writer.WriteStartObject(); writer.WritePropertyName("name"); writer.WriteValue(dp.Name); if (dp.HasValue) { var value = (dp.Type == typeof(Uri)) ? dp.Value.As <Uri>().OriginalString : dp.Value; writer.WritePropertyName("value"); writer.WriteValue(value); } writer.WritePropertyName("type"); writer.WriteValue(dp.Type.ToFriendlyName()); writer.WriteEndObject(); })); }
/// <summary> /// Adds an <see cref="StringValues"/> JSON converter to the list. /// </summary> /// <param name="converters">The list of JSON converters.</param> public static void AddStringValuesConverter(this ICollection <JsonConverter> converters) { converters.Add(DynamicJsonConverter.Create <StringValues>((writer, values) => { if (values.Count <= 1) { writer.WriteValue(values.ToString()); } else { writer.WriteStartArray(); foreach (var value in values) { writer.WriteValue(value); } writer.WriteEndArray(); } })); }
/// <summary> /// Deserializes the specified <paramref name="value" /> into an object of <paramref name="valueType"/>. /// </summary> /// <param name="value">The string from which to deserialize the object graph.</param> /// <param name="valueType">The type of the deserialized object.</param> /// <returns>An object of <paramref name="valueType"/>.</returns> /// <remarks>This method will deserialize, in the order specified, using one of either:<br /> /// 1. the explicitly defined <see cref="JsonFormatterOptions.ReaderFormatter" /> delegate<br /> /// 2. the implicit or explicit defined delegate in <see cref="JsonFormatterOptions.ReaderFormatters" /> dictionary<br /> /// 3. if neither was specified, a default JSON reader implementation will be used.</remarks> public override object Deserialize(Stream value, Type valueType) { var converter = Options.Converter; if (converter == null) { var formatter = Options.ParseReaderFormatter(valueType); converter = DynamicJsonConverter.Create(valueType, Options.Settings, null, formatter); } var serializer = JsonSerializer.Create(Options.Settings); serializer.Converters.Add(converter); using (JsonTextReader reader = new JsonTextReader(new StreamReader(value, true))) { return(serializer.Deserialize(reader, valueType)); } }