using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public partial class TwitchData
public Datum[] Data { get; set; }
[JsonProperty("pagination")]
public Pagination Pagination { get; set; }
public partial class Datum
public string Id { get; set; }
[JsonProperty("user_id")]
[JsonConverter(typeof(ParseStringConverter))]
public long UserId { get; set; }
[JsonProperty("game_id")]
[JsonConverter(typeof(ParseStringConverter))]
public long GameId { get; set; }
[JsonProperty("community_ids")]
public object[] CommunityIds { get; set; }
public string Type { get; set; }
public string Title { get; set; }
[JsonProperty("viewer_count")]
public long ViewerCount { get; set; }
[JsonProperty("started_at")]
public DateTimeOffset StartedAt { get; set; }
[JsonProperty("language")]
public string Language { get; set; }
[JsonProperty("thumbnail_url")]
public string ThumbnailUrl { get; set; }
public partial class Pagination
public string Cursor { get; set; }
public partial class TwitchData
public static TwitchData FromJson(string json) { return JsonConvert.DeserializeObject<TwitchData>(json, Converter.Settings); }
public static class Serialize
public static string ToJson(this TwitchData self) { return JsonConvert.SerializeObject(self, Converter.Settings); }
internal static class Converter
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
internal class ParseStringConverter : JsonConverter
public override bool CanConvert(Type t) { return t == typeof(long) || t == typeof(long?); }
public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null) return null;
var value = serializer.Deserialize<string>(reader);
if (Int64.TryParse(value, out l))
throw new Exception("Cannot unmarshal type long");
public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
if (untypedValue == null)
serializer.Serialize(writer, null);
var value = (long)untypedValue;
serializer.Serialize(writer, value.ToString());
public static readonly ParseStringConverter Singleton = new ParseStringConverter();
public static void Test()
foreach (var json in GetJson())
static void Test(string jsonString)
var twitchData = TwitchData.FromJson(jsonString);
var json2 = Serialize.ToJson(twitchData);
Console.WriteLine(json2);
static IEnumerable<string> GetJson()
""user_id"": ""59788312"",
""started_at"": ""2018-09-07T16:30:09Z"",
""thumbnail_url"": ""url""
""cursor"": ""eydBIjpwdWGsLaJhIjp7IkGH4hNl6CH6MXr9""
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");