https://stackoverflow.com/questions/48243881

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
					
public class Program
{
	public static void Main()
	{
		var json = @"{""ids"":[{""id"":1},{""id"":2}]}";
		var result = JsonConvert.DeserializeObject<Foo>(json);
		
		Console.WriteLine("ids: " + string.Join(",", result.MyIds.Select(id => id.ToString())));
		Console.WriteLine("\n");
		
		Console.WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
	}
}

class Foo
{
	[JsonProperty("ids")]
	[JsonConverter(typeof(CustomArrayConverter<int>), "id")]
	public int[] MyIds { get; set; }
}

class CustomArrayConverter<T> : JsonConverter
{
	string PropertyName { get; set; }
	
	public CustomArrayConverter(string propertyName)
	{
		PropertyName = propertyName;
	}
	
	public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
	{
		JArray array = new JArray(JArray.Load(reader).Select(jo => jo[PropertyName]));
		return array.ToObject(objectType, serializer);
	}
	
	public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
	{
		IEnumerable<T> items = (IEnumerable<T>)value;
		JArray array = new JArray(items.Select(i => new JObject(new JProperty(PropertyName, JToken.FromObject(i, serializer)))));
		array.WriteTo(writer);
	}
	
	public override bool CanConvert(Type objectType)
	{
		// CanConvert is not called when the [JsonConverter] attribute is used
		return false;
	}
}
;