using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class ForeignJsonNetContainerConverter : ForeignJsonNetBaseConverter
static readonly string [] Names = new []
"Newtonsoft.Json.Linq.JObject",
"Newtonsoft.Json.Linq.JArray",
"Newtonsoft.Json.Linq.JConstructor",
"Newtonsoft.Json.Linq.JRaw",
protected override IReadOnlyCollection<string> TypeNames { get { return Names; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
var json = value.ToString();
using (var stringReader = new StringReader(json))
using (var jsonReader = new JsonTextReader(stringReader))
writer.WriteToken(jsonReader);
public class ForeignJsonNetValueConverter : ForeignJsonNetBaseConverter
static readonly string [] Names = new []
"Newtonsoft.Json.Linq.JValue",
protected override IReadOnlyCollection<string> TypeNames { get { return Names; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
var underlyingValue = ((dynamic)value).Value;
if (underlyingValue == null)
serializer.Serialize(writer, underlyingValue);
public abstract class ForeignJsonNetBaseConverter : JsonConverter
protected abstract IReadOnlyCollection<string> TypeNames { get; }
public override bool CanConvert(Type objectType)
if (objectType.IsPrimitive)
if (objectType == typeof(JToken) || objectType.IsSubclassOf(typeof(JToken)))
var fullname = objectType.FullName;
if (TypeNames.Contains(fullname))
public override bool CanRead { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public class JobSummary {
public Job Job { get; set; }
public Status Status { get; set; }
public object JobOutput { get; set; }
public int Progress { get; set; }
public static void Test()
var summary = new JobSummary
JobOutput = new JToken []
JObject.FromObject(new { Count = 0 }),
JArray.FromObject(new [] { new { Count = 0 }}),
new JValue(new DateTime(2020, 4, 2, 16, 10, 10, DateTimeKind.Utc)),
new JRaw(@"[[{""aa"":""bb""}]]"),
var settings = new JsonSerializerSettings
new ForeignJsonNetContainerConverter(), new ForeignJsonNetValueConverter()
var json = JsonConvert.SerializeObject(summary, Formatting.Indented, settings);
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: ");