using System.Collections.Generic;
using Newtonsoft.Json.Serialization;
public static void Main()
var results = new List<MyDto>
Identifier = new KeyValuePair<string, string>("Car", "Ford"),
Identifier = new KeyValuePair<string, string>("Train", "Bombardier"),
var settings = new JsonSerializerSettings
Converters = new List<JsonConverter> { new MyDtoConverter() },
Formatting = Formatting.Indented
string json = JsonConvert.SerializeObject(results, settings);
public KeyValuePair<string, string> Identifier { get; set; }
public double Value1 { get; set; }
public string Value2 { get; set; }
public class MyDtoConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(MyDto);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
MyDto dto = (MyDto)value;
writer.WriteStartObject();
writer.WritePropertyName(dto.Identifier.Key);
writer.WriteValue(dto.Identifier.Value);
var contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(typeof(MyDto));
foreach (JsonProperty prop in contract.Properties.Where(p => p.PropertyName != nameof(MyDto.Identifier)))
writer.WritePropertyName(prop.PropertyName);
writer.WriteValue(prop.ValueProvider.GetValue(dto));
public override bool CanRead => false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();