using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json.Converters;
public partial class WorldBankApiResponse
[JsonProperty("indicator")]
public WorldBankApiIdValue Indicator { get; set; }
[JsonProperty("country")]
public WorldBankApiIdValue Country { get; set; }
[JsonProperty("countryiso3code")]
public string Countryiso3Code { get; set; }
public string Date { get; set; }
public double Value { get; set; }
public string Unit { get; set; }
[JsonProperty("obs_status")]
public string ObsStatus { get; set; }
[JsonProperty("decimal")]
public long Decimal { get; set; }
public partial class WorldBankApiIdValue
public string Id { get; set; }
public string Value { get; set; }
public partial class WorldBankApiResponseGlobal
public long Page { get; set; }
public long Pages { get; set; }
[JsonProperty("per_page")]
public long PerPage { get; set; }
public long Total { get; set; }
[JsonProperty("sourceid")]
public string Sourceid { get; set; }
[JsonProperty("sourcename")]
public string Sourcename { get; set; }
[JsonProperty("lastupdated")]
public DateTimeOffset Lastupdated { get; set; }
public partial struct WorldBankApiResponseUnion
public WorldBankApiResponseGlobal WorldBankApiResponseGlobal;
public WorldBankApiResponse[] WorldBankApiResponse;
public static implicit operator WorldBankApiResponseUnion(WorldBankApiResponseGlobal WorldBankApiResponseGlobal) => new WorldBankApiResponseUnion { WorldBankApiResponseGlobal = WorldBankApiResponseGlobal };
public static implicit operator WorldBankApiResponseUnion(WorldBankApiResponse[] WorldBankApiResponse) => new WorldBankApiResponseUnion { WorldBankApiResponse = WorldBankApiResponse };
internal static class Converter
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
WorldBankApiResponseUnionConverter.Singleton,
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
internal class WorldBankApiResponseUnionConverter : JsonConverter
public override bool CanConvert(Type t) => t == typeof(WorldBankApiResponseUnion) || t == typeof(WorldBankApiResponseUnion?);
public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
switch (reader.TokenType)
case JsonToken.StartObject:
var objectValue = serializer.Deserialize<WorldBankApiResponseGlobal>(reader);
return new WorldBankApiResponseUnion { WorldBankApiResponseGlobal = objectValue };
case JsonToken.StartArray:
var arrayValue = serializer.Deserialize<WorldBankApiResponse[]>(reader);
return new WorldBankApiResponseUnion { WorldBankApiResponse = arrayValue };
throw new Exception("Cannot unmarshal type WorldBankApiResponseUnion");
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
var value = (WorldBankApiResponseUnion)untypedValue;
if (value.WorldBankApiResponse != null)
serializer.Serialize(writer, value.WorldBankApiResponse);
if (value.WorldBankApiResponseGlobal != null)
serializer.Serialize(writer, value.WorldBankApiResponseGlobal);
throw new Exception("Cannot marshal type WorldBankApiResponseUnion");
public static readonly WorldBankApiResponseUnionConverter Singleton = new WorldBankApiResponseUnionConverter();
public static void Main()
""sourcename"": ""World Development Indicators"",
""lastupdated"": ""2021-10-28""
""id"": ""NY.GDP.PCAP.KD.ZG"",
""value"": ""GDP per capita growth (annual %)""
""countryiso3code"": ""CAN"",
""value"": -6.33904652535297,
var result = JsonConvert.DeserializeObject<WorldBankApiResponseUnion[]>(input, Converter.Settings);
foreach(var item in result){
item.WorldBankApiResponse.Dump();
item.WorldBankApiResponseGlobal.Dump();