using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.Collections.Specialized;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public StringId Id { get; set; }
public string Name { get; set; }
[TypeConverter(typeof(StringIdConverter))]
public string Value { get; set; }
class StringIdConverter : TypeConverter
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
if (sourceType == typeof(string))
return base.CanConvertFrom(context, sourceType);
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
if (destinationType == typeof(StringId))
return base.CanConvertTo(context, destinationType);
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
return new StringId { Value = (string)value };
return base.ConvertFrom(context, culture, value);
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
if (destinationType == typeof(string) && value is StringId)
return ((StringId)value).Value;
return base.ConvertTo(context, culture, value, destinationType);
public static void Main()
var test = new Car { Id = new StringId { Value = "1492" }, Name = "my name" };
var json = JsonConvert.SerializeObject(test, Formatting.Indented);
var test2 = JsonConvert.DeserializeObject<Car>(json);
Console.WriteLine("Deserialized Id.Value: ");
Console.WriteLine(test2.Id.Value);