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 WrapWithValueContractResolver : DefaultContractResolver
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
var property = base.CreateProperty(member, memberSerialization);
if (property.Converter == null && property.ItemConverter == null)
property.Converter = (JsonConverter)Activator.CreateInstance(typeof(WrapWithValueConverter<>).MakeGenericType(property.PropertyType));
public class WrapWithValueConverter<TValue> : JsonConverter
sealed class DTO { [JsonConverter(typeof(NoConverter)), JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)] public TValue value { get; set; } public object GetValue() => value; }
public override bool CanConvert(Type objectType) => typeof(TValue).IsAssignableFrom(objectType);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
=> serializer.Serialize(writer, new DTO { value = (TValue)value });
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
=> serializer.Deserialize<DTO>(reader)?.GetValue();
public class NoConverter : JsonConverter
public override bool CanConvert(Type objectType) { throw new NotImplementedException(); }
public override bool CanRead => false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) => throw new NotImplementedException();
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
[JsonProperty("project", NullValueHandling = NullValueHandling.Ignore)]
public int? Project { get; set; }
[JsonProperty("printDescriptionOnInvoice", NullValueHandling = NullValueHandling.Ignore)]
public bool PrintDescriptionOnInvoice { get; set; }
[JsonProperty("printNoteOnExternalDocuments", NullValueHandling = NullValueHandling.Ignore)]
public bool PrintNoteOnExternalDocuments { get; set; }
[JsonProperty("printNoteOnInternalDocuments", NullValueHandling = NullValueHandling.Ignore)]
public bool PrintNoteOnInternalDocuments { get; set; }
[JsonProperty("soBillingContact", NullValueHandling = NullValueHandling.Ignore)]
public Contact SoBillingContact { get; set; }
[JsonProperty("overrideContact", NullValueHandling = NullValueHandling.Ignore)]
public bool OverrideContact { get;set; }
[JsonProperty("attention", NullValueHandling = NullValueHandling.Ignore)]
public string Attention { get; set; }
[JsonProperty("email", NullValueHandling = NullValueHandling.Ignore)]
public string Email { get; set; }
[JsonProperty("fax", NullValueHandling = NullValueHandling.Ignore)]
public string Fax { get; set; }
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; set; }
[JsonProperty("phone1", NullValueHandling = NullValueHandling.Ignore)]
public string Phone1 { get; set; }
[JsonProperty("phone2", NullValueHandling = NullValueHandling.Ignore)]
public string Phone2 { get; set; }
[JsonProperty("web", NullValueHandling = NullValueHandling.Ignore)]
public string Web { get; set; }
public static void Test()
DefaultContractResolver resolver = new WrapWithValueContractResolver
static void Test(IContractResolver resolver)
Console.WriteLine("\nTesting with no resolver:");
Console.WriteLine("\nTesting with contract resolver {0}:", resolver);
var vSalesOrder = new SalesOrder()
PrintDescriptionOnInvoice = true,
PrintNoteOnExternalDocuments = true,
SoBillingContact = new Contact
var settings = new JsonSerializerSettings
ContractResolver = resolver,
var json = JsonConvert.SerializeObject(vSalesOrder, Formatting.Indented, settings);
var order2 = JsonConvert.DeserializeObject<SalesOrder>(json, settings);
var json2 = JsonConvert.SerializeObject(order2, Formatting.Indented, settings);
Assert.AreEqual(json, json2);
Assert.AreEqual(vSalesOrder.Project, order2.Project);
Assert.AreEqual(vSalesOrder.PrintDescriptionOnInvoice, order2.PrintDescriptionOnInvoice);
Assert.AreEqual(vSalesOrder.PrintNoteOnExternalDocuments, order2.PrintNoteOnExternalDocuments);
Assert.AreEqual(vSalesOrder.SoBillingContact.Attention, order2.SoBillingContact.Attention);
Assert.AreEqual(vSalesOrder.SoBillingContact.Email, order2.SoBillingContact.Email);
Assert.AreEqual(vSalesOrder.SoBillingContact.Fax, order2.SoBillingContact.Fax);
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Namespace, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");