using System.Globalization;
using Newtonsoft.Json.Serialization;
public static void Main()
PosInvoice inv = new PosInvoice
Description = "Services",
Console.WriteLine(SerializeInvoice(inv, true));
Console.WriteLine(SerializeInvoice(inv, false));
static string SerializeInvoice(PosInvoice invoice, bool serializeDecimalsAsStrings)
var settings = new JsonSerializerSettings { Formatting = Formatting.Indented };
if (serializeDecimalsAsStrings)
settings.Converters.Add(new InvoiceAmountsAsStringsConverter());
return JsonConvert.SerializeObject(invoice, settings);
public string Description { get; set; }
public decimal UnitPrice { get; set; }
public decimal Quantity { get; set; }
public decimal TotalAmount { get; set; }
public class InvoiceAmountsAsStringsConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(PosInvoice);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
PosInvoice invoice = (PosInvoice)value;
JsonObjectContract contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(typeof(PosInvoice));
writer.WriteStartObject();
foreach (JsonProperty prop in contract.Properties)
writer.WritePropertyName(prop.PropertyName);
object propValue = prop.ValueProvider.GetValue(invoice);
if (propValue is decimal)
writer.WriteValue(((decimal)propValue).ToString(CultureInfo.InvariantCulture));
serializer.Serialize(writer, propValue);
public override bool CanRead
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();