Exemplo n.º 1
0
 /// <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);
     }));
 }
Exemplo n.º 2
0
 /// <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()));
 }
Exemplo n.º 3
0
        /// <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);
                }
            }));
        }
Exemplo n.º 4
0
        /// <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();
            }));
        }
Exemplo n.º 5
0
 /// <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();
     }));
 }
Exemplo n.º 6
0
 /// <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();
         }
     }));
 }
Exemplo n.º 7
0
        /// <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));
            }
        }