using System.Collections.Generic;
using System.ComponentModel;
using Newtonsoft.Json.Linq;
public static void Main()
var dataMapperModels = new List<DataMapper>();
var model = new DataMapper
Name = "performanceLevels",
SubDataMappers = new List<DataMapper>()
Name = "performanceLevel_1",
SubDataMappers = new List<DataMapper>()
DataMapperProperty = new DataMapperProperty()
SourceColumn = "title-column",
dataMapperModels.Add(model);
var jsonMap = JsonConvert.SerializeObject(dataMapperModels, new JsonSerializerSettings()
Formatting = Formatting.Indented
Console.WriteLine(jsonMap);
public class DataMapperJsonSerializer : JsonConverter
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
var dataMapper = (DataMapper)value;
if (dataMapper.SubDataMappers.Any())
writer.WriteStartObject();
writer.WritePropertyName(dataMapper.Name);
writer.WriteStartArray();
dataMapper.SubDataMappers.ForEach(sub =>
writer.WriteStartObject();
writer.WritePropertyName(sub.Name);
serializer.Serialize(writer, sub.SubDataMappers);
writer.WriteStartObject();
writer.WritePropertyName(dataMapper.Name);
serializer.Serialize(writer, dataMapper.DataMapperProperty);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject jsonObject = JObject.Load(reader);
var properties = jsonObject.Properties().ToList();
Name = properties[0].Name,
DataMapperProperty = (DataMapperProperty)properties[0].Value
public override bool CanConvert(Type objectType)
return typeof(DataMapper).IsAssignableFrom(objectType);
[JsonConverter(typeof(DataMapperJsonSerializer))]
SubDataMappers = new List<DataMapper>();
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public DataMapperProperty DataMapperProperty { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public List<DataMapper> SubDataMappers { get; set; }
public class DataMapperProperty
[JsonProperty(PropertyName = "data-type", NullValueHandling = NullValueHandling.Ignore)]
public string DataType { get; set; }
[JsonProperty(PropertyName = "source", NullValueHandling = NullValueHandling.Ignore)]
public string Source { get; set; }
[JsonProperty(PropertyName = "source-column", NullValueHandling = NullValueHandling.Ignore)]
public string SourceColumn { get; set; }
[JsonProperty(PropertyName = "source-table", NullValueHandling = NullValueHandling.Ignore)]
public string SourceTable { get; set; }
[JsonProperty(PropertyName = "default", NullValueHandling = NullValueHandling.Ignore)]
public string Default { get; set; }
[JsonProperty(PropertyName = "value", NullValueHandling = NullValueHandling.Ignore)]
public string Value { get; set; }
public static explicit operator DataMapperProperty(JToken v)
return new DataMapperProperty()
DataType = v.Value<string>("data-type"),
Source = v.Value<string>("source"),
SourceColumn = v.Value<string>("source-column"),
SourceTable = v.Value<string>("source-table"),
Default = v.Value<string>("default"),
Value = v.Value<string>("value")