http://stackoverflow.com/questions/37371786/json-net-jsonproperty-at-runtime

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
					
public class Program
{
	public static void Main()
	{
		Foo foo = new Foo
		{
			Id = 1,
			Name = "Thing 1",
			AlternateName = "The First Thing",
			Description = "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.",
			Color = "Yellow"
		};
		
		Console.WriteLine("--- Normal serialization using JsonIgnore and JsonConverter to reduce size ---");
		Console.WriteLine(Serialize(foo, false));
		Console.WriteLine();
		Console.WriteLine("--- Ignoring JsonIgnore and JsonConverter attributes to get full JSON ---");
		Console.WriteLine(Serialize(foo, true));
	}

	static string Serialize(object obj, bool includeEverything)
	{
		JsonSerializerSettings settings = new JsonSerializerSettings();
		settings.Formatting = Formatting.Indented;
		if (includeEverything)
		{
			settings.ContractResolver = new IgnoreJsonAttributesResolver();
		}
		
		return JsonConvert.SerializeObject(obj, settings);
	}
}

class Foo
{
	public int Id { get; set; }
	public string Name { get; set; }
	[JsonIgnore]
	public string AlternateName { get; set; }
	[JsonProperty("Desc")]
	[JsonConverter(typeof(StringTruncatingConverter))]
	public string Description { get; set; }
	[JsonIgnore]
	public string Color { get; set; }
}

class IgnoreJsonAttributesResolver : DefaultContractResolver
{
	protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
	{
		IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
		foreach (var prop in props)
		{
			prop.Ignored = false;   // Ignore [JsonIgnore]
			prop.Converter = null;  // Ignore [JsonConverter]
			prop.PropertyName = prop.UnderlyingName;  // Use original property name instead of [JsonProperty] name
		}
		return props;
	}
}

class StringTruncatingConverter : JsonConverter
{
	const int MaxLength = 45;
	
	public override bool CanConvert(Type objectType)
	{
		return (objectType == typeof(string));
	}
	
	public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
	{
		string s = (string)value;
		if (s.Length > MaxLength) s = s.Substring(0, MaxLength);
		writer.WriteValue(s);
	}
	
	public override bool CanRead
	{
		get { return false; }
	}
	
	public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
	{
		throw new NotImplementedException();
	}
}
;