using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Diagnostics;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
namespace StrictConverters
class IntConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(int) || objectType == typeof(int?);
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
switch (reader.TokenType)
return (int)JToken.Load(reader);
if (Int32.TryParse(reader.Value.ToString(), NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out num))
throw new JsonSerializationException(string.Format("Unexpected token {0} at path {1}", reader.TokenType, reader.Path));
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
var convertible = (IConvertible)value;
serializer.Serialize(writer, convertible.ToString(NumberFormatInfo.InvariantInfo));
namespace TolerantConverters
class IntConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(int) || objectType == typeof(int?);
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
switch (reader.TokenType)
return (int)JToken.Load(reader);
if (Int32.TryParse(reader.Value.ToString(), NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out num))
Debug.WriteLine(string.Format("Unexpected token {0} at path {1}", reader.TokenType, reader.Path));
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
var convertible = (IConvertible)value;
serializer.Serialize(writer, convertible.ToString(NumberFormatInfo.InvariantInfo));
public int? Id { get; set; }
public string CompanyName { get; set; }
public static void Test()
var companyName = "name";
foreach (var converter in new JsonConverter[] { new TolerantConverters.IntConverter(), new StrictConverters.IntConverter() })
Console.WriteLine(string.Format("\nTesting {0}", converter));
foreach (var json in GetJson(companyName))
Test(json, converter, companyName);
Console.WriteLine("Done");
static void Test(string json, JsonConverter converter, string companyName)
Console.WriteLine("\nInput JSON: ");
var company = JsonConvert.DeserializeObject<Company>(json, new[] { converter });
var json2 = JsonConvert.SerializeObject(company, Formatting.Indented, new[] { converter });
Console.WriteLine("Re-serialized JSON: ");
Console.WriteLine(json2);
Assert.IsTrue(company.CompanyName == companyName);
catch (AssertionFailedException ex)
Console.WriteLine(ex.Message);
static IEnumerable<string> GetJson(string companyName)
var jsons = new List<string>();
var company = JToken.FromObject(new Company { Id = 101, CompanyName = companyName });
jsons.Add(company.ToString(Formatting.None));
jsons.Add(company.ToString(Formatting.None));
jsons.Add(company.ToString(Formatting.None));
company["Id"] = "bad 101";
jsons.Add(company.ToString(Formatting.None));
company["Id"] = DateTime.Today.ToUniversalTime();
jsons.Add(company.ToString(Formatting.None));
jsons.Add(company.ToString(Formatting.None));
company["Id"] = new JArray(new[] { company, company });
jsons.Add(company.ToString(Formatting.None));
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");