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;
public class AuthorConverter : JsonConverter
public override bool CanConvert(Type objectType) { return objectType == typeof(Author); }
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.MoveToContentAndAssert().TokenType == JsonToken.Null)
else if (reader.TokenType == JsonToken.String)
return new Author { name = (string) reader.Value };
var author = new Author();
serializer.Populate(reader, author);
UnityEngine.Debug.Log(ex);
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()
var settings = new JsonSerializerSettings
Converters = { new AuthorConverter() },
var json1in = "\"my name\"";
var author1 = JsonConvert.DeserializeObject<Author>(json1in, settings);
Assert.IsTrue(author1.name == "my name");
var json1 = JsonConvert.SerializeObject(author1, settings);
Console.WriteLine(json1);
Assert.IsTrue(JToken.DeepEquals(JToken.Parse(json1), JToken.Parse(@"{""name"":""my name"",""email"":null,""url"":null}")));
var json2in = @"{""name"":""my name"",""email"":""my email"",""url"":""my url""}";
var author2 = JsonConvert.DeserializeObject<Author>(json2in, settings);
Assert.IsTrue(author2.name == "my name" && author2.email == "my email" && author2.url == "my url");
var json2 = JsonConvert.SerializeObject(author2, settings);
Assert.IsTrue(JToken.DeepEquals(JToken.Parse(json2), JToken.Parse(json2in)));
public static class Debug
public static void Log(object s)
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: ");