Извините за невежество, так как я новичок. Я пытаюсь получить информацию о потоке с 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, надеюсь, теперь он более понятен.
Разве вы не задавали тот же вопрос час назад?
В первом посте было 2 вопроса вместо того, чтобы сосредоточиться на чем-то одном. Я разделил их, чтобы было легче устранять неполадки.
Вы уверены, что получаете только эти две строки json? потому что это работает хорошо
Я тестировал с помощью curl -H 'Client-ID: token' \ -X GET 'https://api.twitch.tv/helix/streams?user_id=streamID и могу получить JSON. Программа также получает JSON. Исключение возникает при выполнении данной строки.
Очевидно, проблема заключается в содержимом переменной json, которую вы передаете процедуре десериализации. Проверьте содержимое переменной. Не следует слепо предполагать, что переменная имеет «правильное» содержимое (= правильную строку JSON) только потому, что вы можете получить ожидаемую строку JSON каким-либо другим способом. При проверке этой переменной - я предполагаю, что это строка - обратите особое внимание на любые возможные нежелательные непечатаемые символы (например, \ 0x00 или другие «невидимые» символы) в начале строки.
Я не вижу ошибок с упомянутыми полезными нагрузками Json. Проверьте скрипт dotnet это.
Полученное сообщение об ошибке означает, что синтаксический анализатор Json обнаружил в предоставленной строке символ, который не соответствует (ослабленному) синтаксису JSON. Поскольку в сообщении об ошибке в качестве проблемного символа в строке 0, позиции 0 указано отсутствие или непечатаемый символ (''), скорее всего, переменная json может быть пустой или содержать проблемный непечатаемый символ в самом начале ...
для начала вы вызываете client.GetStringAsync (uri); без использования await, так что jsonString, скорее всего, на самом деле НЕ содержит JSON, который, по вашему мнению, он





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