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 IDictionary<string, string> CustomAttributes { get; set; }
[JsonDictionary(NamingStrategyType = typeof(DefaultNamingStrategy))]
public class VerbatimDictionary<TKey, TValue> : Dictionary<TKey, TValue>
public static void Test()
var root = new RootObject
CustomAttributes = new VerbatimDictionary<string, string>()
{"Custom Attribute 1", "1"},
{"CustomAttribute 2", "2"}
var settings = new JsonSerializerSettings
ContractResolver = new CamelCasePropertyNamesContractResolver(),
var json = JsonConvert.SerializeObject(root, Formatting.Indented, settings);
Assert.IsTrue(((JObject)JToken.Parse(json)["customAttributes"]).Properties().Select(p => p.Name).SequenceEqual(root.CustomAttributes.Keys));
Assert.IsTrue(JsonConvert.DeserializeObject<RootObject>(json, settings).CustomAttributes.Keys.SequenceEqual(root.CustomAttributes.Keys));
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.CodeBase.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];