Nuke.Cola
Loading...
Searching...
No Matches
OneOrManyConverter.cs
1using Newtonsoft.Json;
2using Newtonsoft.Json.Linq;
3
4namespace Nuke.Cola;
5
6/// <summary>
7/// A JSON converter for property which may have a single value or an array of values when de-serializing. It will
8/// always serialize an array.
9/// </summary>
10/// <typeparam name="T">Underlying type of the property</typeparam>
11public class OneOrManyConverter<T> : JsonConverter
12{
13 public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
14 {
15 if (value is List<T?> values)
16 {
17 writer.WriteStartArray();
18 foreach (var item in values)
19 {
20 writer.WriteValue(item);
21 }
22 writer.WriteEndArray();
23 }
24 }
25
26 public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
27 {
28 var token = JToken.Load(reader);
29
30 return token.Type switch
31 {
32 JTokenType.Array => token.ToObject<List<T?>>(),
33 JTokenType.Null => null,
34 _ => [token.ToObject<T>()]
35 };
36 }
37
38 public override bool CanConvert(Type objectType) => objectType == typeof(List<T?>);
39}
A JSON converter for property which may have a single value or an array of values when de-serializing...