Как я могу получить информацию о фрагменте из моего ответа api json?

#c# #json

Вопрос:

Вот как выглядит моя логика:

 public void SetVideoInfo(string videoID)
{
    var url = new RestClient("https://www.googleapis.com/youtube/v3/videos? 
        part=snippetamp;fields=items(snippet(title,description))amp;id="   videoID   
        "amp;key=somekey");
    url.Timeout = -1;

    var urlRequest = new RestRequest(Method.GET);
    var urlResponse = url.Execute(urlRequest);
    var response = JObject.Parse(urlResponse.Content);
    var data = (JArray)response["items"];

    for (int i = 0; i < data.Count; i  )
    {
        var videoTitle = data[i]["title"];
        var videoDescription = data[i]["description"];

        this.VideoTitle = videoTitle.ToString().Trim();
        this.VideoDescription = videoDescription.ToString().Trim();
    }
}
 

Вот как выглядит ответ API:

 {
    "items": [
        {
            "snippet": {
                "title": "some title",
                "description": "some description"
            }
        }
    ]
}
 

Моя текущая логика доходит до «фрагмента», но я получаю нули для заголовка и описания. Я просто хочу знать, как я могу добраться до атрибутов заголовка и описания.

Комментарии:

1. В RestSharp есть методы для разбора результатов непосредственно в соответствующие классы C#, используйте их вместо того, чтобы возиться с JObject s и JArray s.

2. Кроме того, это не полный ответ JSON — вы пропустили окружающее {.....} ?

3. Я пропустил несколько фигурных скобок. Вот как на самом деле выглядит ответ. { «элементы»: [ { «фрагмент»: { «название»: «некоторое название», «описание»: «некоторое описание» } } ] }

Ответ №1:

В RestSharp есть методы для разбора результатов непосредственно в соответствующие классы C#, используйте их вместо того, чтобы возиться с JObject s и JArray s. С моей точки зрения, что-то вроде этого должно сработать.

Во-первых, создайте несколько классов для хранения ваших данных:

 public class Root
{
    public List<Item> Items { get; set; }
}

public class Item
{
    public Snippet Snippet { get; set; }
}

public class Snippet
{
    public string Title { get; set; }
    public string Description { get; set; }
}
 

Теперь вызовите универсальный метод RestSharp:

 var urlResponse = url.Execute<Root>(urlRequest);
 

Теперь вы можете получить доступ к свойствам безопасным для типа способом.

 var title = urlResponse.Items[0].Snippet.Title
var description = urlResponse.Items[0].Snippet.Description
 

Комментарии:

1. Потрясающее спасибо! Я попробую, посмотрим, смогу ли я заставить его работать. Я получаю ошибку в элементах, где это элементы[0], но я думаю, что просто что-то упускаю.

2. @seacode вы получаете ошибку в элементах[0], возможно, в элементах нет значения индекса 0. Проверьте один раз

3. @Rajesh Ну, это не похоже на ошибку исключения из диапазона или что-то в этом роде. Его подчеркнутый красный говорит о том, что iRestResponse<Root> не содержит определения для элементов.

4. О, вам может понадобиться что-то вроде urlResponse.Content.Items...

5. .Контент не работает, но . Данные делают это. Так что это шаг в правильном направлении. Однако они все равно возвращаются как нулевые, так что, может быть, моя индексация неверна?