Newtonsoft.Json.JsonReaderException is thrown when DeserializeObject<> is called

Viewed 607

Excuse my ignorance since I'm a newbie. I'm trying to get stream info from Twitch whether the stream is live or not. I'm doing this by using HttpClient and GET request. The class TwitchData deserialize JSON as object is the following.

public partial class TwitchData
{
    [JsonProperty("data")]
    public Datum[] Data { get; set; }

    [JsonProperty("pagination")]
    public Pagination Pagination { get; set; }
}

public partial class Datum
{
    [JsonProperty("id")]
    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; }

    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("title")]
    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
{
    [JsonProperty("cursor")]
    public string Cursor { get; set; }
}

public partial class TwitchData
{
    public static TwitchData FromJson(string json) => JsonConvert.DeserializeObject<TwitchData>(json, QuickType.Converter.Settings);
}

public static class Serialize
{
    public static string ToJson(this TwitchData self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
}

internal static class Converter
{
    public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
        DateParseHandling = DateParseHandling.None,
        Converters = {
            new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
        },
    };
}

internal class ParseStringConverter : JsonConverter
{
    public override bool CanConvert(Type t) => 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);
        long l;
        if (Int64.TryParse(value, out l))
        {
            return 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);
            return;
        }
        var value = (long)untypedValue;
        serializer.Serialize(writer, value.ToString());
        return;
    }

    public static readonly ParseStringConverter Singleton = new ParseStringConverter();
}

I do the HttpClient GET request with the following

HttpClient client = new HttpClient();
string uri = "https://api.twitch.tv/helix/streams?user_id=59980349";
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Client-ID", token);
var result = client.GetStringAsync(uri);
jsonString = result.ToString();
twitchData = PwdResetRequest.FromJson(jsonString);

When this is run, Newtonsoft.Json.JsonReaderException, Unexpected character encountered while parsing value: S. Path '', line 0, position 0 is thrown. Further debugging, I found that the program breaks at line 71 which is

public static TwitchData FromJson(string json) => JsonConvert.DeserializeObject<TwitchData>(json, QuickType.Converter.Settings);

since I got this class from json2csharp.com, I don't know how to fix that line or why the Exception is thrown.

EDIT: JSON is requested in comments. This is the JSON if the stream is live

{
  "data": [
    {
      "id": "30356128676",
      "user_id": "59788312",
      "game_id": "498652",
      "community_ids": [],
      "type": "live",
      "title": "A stream",
      "viewer_count": 1325,
      "started_at": "2018-09-07T16:30:09Z",
      "language": "en",
      "thumbnail_url": "url"
    }
  ],
  "pagination": {
    "cursor": "eydBIjpwdWGsLaJhIjp7IkGH4hNl6CH6MXr9"
  }
}

and when its offline

{
  "data": [],
  "pagination": {}
}
0 Answers
Related