using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class SplunkLogTextWriter : JsonWriter
readonly TextWriter _writer;
public bool QuotePropertyNames { get; set; }
public SplunkLogTextWriter(TextWriter textWriter)
throw new ArgumentNullException();
public override void Flush()
public override void Close()
public override void WriteComment(string text)
throw new NotImplementedException();
public override void WriteRaw(string json)
public override void WriteStartArray()
public override void WriteStartObject()
public override void WriteStartConstructor(string name)
base.WriteStartConstructor(name);
throw new NotImplementedException();
protected override void WriteEnd(JsonToken token)
case JsonToken.EndObject:
case JsonToken.EndConstructor:
throw new JsonWriterException("Invalid JsonToken: " + token);
public override void WritePropertyName(string name)
base.WritePropertyName(name);
WriteEscapedString(name, QuotePropertyNames);
void WriteEscapedString(string s, bool quote)
quote = quote || s.Length == 0 || s.Any(c => Char.IsWhiteSpace(c) || c == '=' || c == ']' || c == '}');
_writer.Write(@"\u0085");
_writer.Write(@"\u2028");
_writer.Write(@"\u2029");
#region WriteValue methods
public override void WriteNull()
public override void WriteValue(bool value)
_writer.Write(value ? "true" : "false");
public override void WriteValue(byte value)
WriteIntegerValue((ulong)value);
public override void WriteValue(byte[] value)
WriteEscapedString(Convert.ToBase64String(value), false);
public override void WriteValue(sbyte value)
WriteIntegerValue(value);
public override void WriteValue(char value)
WriteEscapedString(value.ToString(), false);
public override void WriteValue(short value)
WriteIntegerValue(value);
public override void WriteValue(ushort value)
WriteIntegerValue((ulong)value);
public override void WriteValue(int value)
WriteIntegerValue(value);
public override void WriteValue(uint value)
WriteIntegerValue((ulong)value);
public override void WriteValue(long value)
WriteIntegerValue(value);
public override void WriteValue(ulong value)
WriteIntegerValue(value);
private void WriteIntegerValue(long value)
_writer.Write(value.ToString(Culture ?? CultureInfo.InvariantCulture));
private void WriteIntegerValue(ulong value)
_writer.Write(value.ToString(Culture ?? CultureInfo.InvariantCulture));
public override void WriteValue(DateTime value)
var s = JsonConvert.ToString(value, DateFormatHandling, DateTimeZoneHandling);
WriteEscapedString(s.Substring(1, s.Length - 2), false);
public override void WriteValue(DateTimeOffset value)
var s = JsonConvert.ToString(value, DateFormatHandling);
WriteEscapedString(s.Substring(1, s.Length - 2), false);
public override void WriteValue(decimal value)
_writer.Write(value.ToString(Culture ?? CultureInfo.InvariantCulture));
public override void WriteValue(double value)
_writer.Write(JsonConvert.ToString(value));
public override void WriteValue(string value)
WriteEscapedString(value, false);
protected override void WriteValueDelimiter()
base.WriteValueDelimiter();
public override void WriteUndefined()
throw new NotImplementedException();
public override void WriteValue(Guid value)
throw new NotImplementedException();
public static void Test()
Console.WriteLine("\nDone.");
var root = new { Name = "John", Age = 18 };
static void TestComplex()
new { Name = "John", Age = 18 },
new { Name = "Jane", Age = 21 },
Date = new DateTime(2018, 1, 1),
String = "Hello There \nWith embedded newline",
Decimal = 110101010110101010.101010101m,
Binary = new byte[] { 101, 202, 254, 0, 3 },
static void Test<T>(T root)
Console.WriteLine("\nInput object in JSON: ");
Console.WriteLine(JsonConvert.SerializeObject(root, Formatting.Indented));
Console.WriteLine("\nInput object in Splunk Log format: ");
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
using (var writer = new SplunkLogTextWriter(sw))
JsonSerializer.CreateDefault().Serialize(writer, root);
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: ");
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");