using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json.Serialization;
public static void Main()
""a"": ""123456789|123456789|123456789|123456789|123456789|"",
""b"": ""123456789|123456789|123456789|123456789|123456789|"",
""c"": ""123456789|123456789|1234"",
""d"": ""123456789|123456789|123456789|123456789|12345"",
var settings = new JsonSerializerSettings
ContractResolver = new StringTruncatingPropertyResolver(30)
var foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Console.WriteLine("a: " + foo.A);
Console.WriteLine("b: " + foo.B);
Console.WriteLine("c: " + foo.C);
Console.WriteLine("d: " + foo.D);
Console.WriteLine("e: " + foo.E);
Console.WriteLine("f: " + foo.F);
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
public string D { get; set; }
public string E { get; set; }
public int F { get; set; }
public class StringTruncatingPropertyResolver : DefaultContractResolver
public int DefaultMaxLength { get; private set; }
public StringTruncatingPropertyResolver(int defaultMaxLength)
DefaultMaxLength = defaultMaxLength;
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
foreach (JsonProperty prop in props.Where(p => p.PropertyType == typeof(string)))
var attr = prop.AttributeProvider
.OfType<MaxLengthAttribute>()
int maxLength = attr != null ? attr.Length : DefaultMaxLength;
prop.ValueProvider = new StringTruncatingValueProvider(prop.ValueProvider, maxLength);
class StringTruncatingValueProvider : IValueProvider
private IValueProvider InnerValueProvider { get; set; }
private int MaxLength { get; set; }
public StringTruncatingValueProvider(IValueProvider innerValueProvider, int maxLength)
InnerValueProvider = innerValueProvider;
public object GetValue(object target)
return InnerValueProvider.GetValue(target);
public void SetValue(object target, object value)
string s = (string)value;
if (s != null && s.Length > MaxLength)
s = s.Substring(0, MaxLength);
InnerValueProvider.SetValue(target, s);