Newtonsoft.Json.JsonReaderException возникает при вызове DeserializeObject <>

Извините за невежество, так как я новичок. Я пытаюсь получить информацию о потоке с Twitch, независимо от того, идет он в прямом эфире или нет. Я делаю это с помощью HttpClient и запроса GET. Класс TwitchData десериализации JSON как объекта выглядит следующим образом.

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();
}

Я выполняю запрос GET HttpClient со следующим

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);

Когда это запущено, выдается Newtonsoft.Json.JsonReaderException, Unexpected character encountered while parsing value: S. Path '', line 0, position 0. При дальнейшей отладке я обнаружил, что программа прерывается в строке 71, которая

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

поскольку я получил этот класс от json2csharp.com, я не знаю, как исправить эту строку или почему возникает исключение.

Обновлено: JSON запрашивается в комментариях. Это JSON, если поток в прямом эфире

{
  "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"
  }
}

и когда он не в сети

{
  "data": [],
  "pagination": {}
}

Вставьте файл json.

TheGeneral 08.09.2018 09:47

Я добавил json, надеюсь, теперь он более понятен.

cptalpdeniz 08.09.2018 10:06

Разве вы не задавали тот же вопрос час назад?

TheGeneral 08.09.2018 10:08

В первом посте было 2 вопроса вместо того, чтобы сосредоточиться на чем-то одном. Я разделил их, чтобы было легче устранять неполадки.

cptalpdeniz 08.09.2018 10:15

Вы уверены, что получаете только эти две строки json? потому что это работает хорошо

D-Shih 08.09.2018 10:22

Я тестировал с помощью curl -H 'Client-ID: token' \ -X GET 'https://api.twitch.tv/helix/streams?user_id=streamID и могу получить JSON. Программа также получает JSON. Исключение возникает при выполнении данной строки.

cptalpdeniz 08.09.2018 10:31

Очевидно, проблема заключается в содержимом переменной json, которую вы передаете процедуре десериализации. Проверьте содержимое переменной. Не следует слепо предполагать, что переменная имеет «правильное» содержимое (= правильную строку JSON) только потому, что вы можете получить ожидаемую строку JSON каким-либо другим способом. При проверке этой переменной - я предполагаю, что это строка - обратите особое внимание на любые возможные нежелательные непечатаемые символы (например, \ 0x00 или другие «невидимые» символы) в начале строки.

user2819245 08.09.2018 10:49

Я не вижу ошибок с упомянутыми полезными нагрузками Json. Проверьте скрипт dotnet это.

user1672994 08.09.2018 10:49

Полученное сообщение об ошибке означает, что синтаксический анализатор Json обнаружил в предоставленной строке символ, который не соответствует (ослабленному) синтаксису JSON. Поскольку в сообщении об ошибке в качестве проблемного символа в строке 0, позиции 0 указано отсутствие или непечатаемый символ (''), скорее всего, переменная json может быть пустой или содержать проблемный непечатаемый символ в самом начале ...

user2819245 08.09.2018 10:52

для начала вы вызываете client.GetStringAsync (uri); без использования await, так что jsonString, скорее всего, на самом деле НЕ содержит JSON, который, по вашему мнению, он

Jason 08.09.2018 14:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
10
493
0

Другие вопросы по теме