using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.ComponentModel;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class LogLevelConverter : JsonConverter<LogLevel>
public override LogLevel ReadJson(JsonReader reader, Type objectType, LogLevel existingValue, bool hasExistingValue, JsonSerializer serializer)
switch (reader.MoveToContentAndAssert().TokenType)
return LogLevel.FromString((string)reader.Value);
throw new JsonSerializationException(string.Format("Unknown token {0}", reader.TokenType));
public override void WriteJson(JsonWriter writer, LogLevel value, JsonSerializer serializer)
var logLevel = (LogLevel)value;
writer.WriteValue(logLevel.Name);
public static partial class JsonExtensions
public static JsonReader MoveToContentAndAssert(this JsonReader reader)
throw new ArgumentNullException();
if (reader.TokenType == JsonToken.None)
while (reader.TokenType == JsonToken.Comment)
public static JsonReader ReadAndAssert(this JsonReader reader)
throw new ArgumentNullException();
throw new JsonReaderException("Unexpected end of JSON stream.");
public static void Test()
Console.WriteLine(JsonConvert.SerializeObject(LogLevel.AllLevels));
Console.WriteLine(JsonSerializer.Create().ContractResolver.ResolveContract(typeof(LogLevel)));
Console.WriteLine("TypeDescriptor.GetConverter(typeof(LogLevel)) = {0}", TypeDescriptor.GetConverter(typeof(LogLevel)).GetType().FullName);
Console.WriteLine("JsonConvert.SerializeObject(LogLevel.Info) = {0}", JsonConvert.SerializeObject(LogLevel.Info));
Console.WriteLine("Convert.ChangeType(LogLevel.Error, typeof(string)) = {0}", Convert.ChangeType(LogLevel.Info, typeof(string)));
Console.WriteLine("((IConvertible)LogLevel.Info).ToType(typeof(string), CultureInfo.InvariantCulture)) = {0}", ((IConvertible)LogLevel.Info).ToType(typeof(string), CultureInfo.InvariantCulture));
var seq = new LogLevelConverter();
Test(new LogLevelConverter());
TestLogInfo(new StringEnumConverter());
static void Test(JsonConverter seq)
Console.WriteLine("\nTesting IList<LogLevel> serialization with converter {0}:", seq);
var allLevelsJson = JsonConvert.SerializeObject(LogLevel.AllLevels, seq);
var allLevels = JsonConvert.DeserializeObject<IList<LogLevel>>(allLevelsJson, seq);
Console.WriteLine(allLevelsJson);
Assert.IsTrue(LogLevel.AllLevels.SequenceEqual(allLevels));
static void TestLogInfo(JsonConverter seq)
Console.WriteLine("Testing LogEventInfo deserialization with converter {0}:", seq);
var info = Newtonsoft.Json.JsonConvert.DeserializeObject<LogEventInfo>(msg.Body, seq);
Console.WriteLine("LogEventInfo deserialized successfully with info.Level = {0}.\n", info.Level);
var json = @"{ ""date"": ""2019-06-04 21:48:24.0753"", ""level"": /* Some Comment */""Error"", ""message"": ""{\""ApplicationId\"":1390760,\""AppStatus\"":\""#PG2\"",\""Status\"":400,\""ErrorCode\"": 1053 }"", ""properties"": ""ResponseBody={\""ApplicationId\"":1390760,\""AppStatus\"":\""#PG2\"",\""Status\"":400,\""ErrorCode\"": 1053 }|GroupId=392934|ApplicationId=1390760|Status=400"", ""callsite"": ""HFD.Enterprise.Logging.Tests.LogTest.LoadTest"", ""logger"": ""WebApiLog"", ""machinename"": ""BRANDONHOSTVS"" }";
public static partial class JsonExtensions
public static JsonReader ReadToContentAndAssert(this JsonReader reader)
return reader.ReadAndAssert().MoveToContentAndAssert();
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");