Проанализируйте ответ json с помощью System.Runtime.Сериализация.Json в C#

#c# #json

Вопрос:

Я хочу знать, как проанализировать ответ JSON с помощью System.Runtime.Сериализация.Пространство имен Json.

Ниже приведен API, я нажимаю:

https://jsonmock.hackerrank.com/api/articles?author=epagaamp;page=0

Я хочу читать поля из этого API, такие как title and url

Ниже приведен код, который я использую

 private const string URL = "https://jsonmock.hackerrank.com/api/articles";
private string URLParameters = "?author=epagaamp;page=0";

public HttpResponseMessage Get()
{
    List<string> rankModels = new List<string>();
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(URL);

    // Add an Accept header for JSON format.
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    HttpResponseMessage response = client.GetAsync(URLParameters).Resu<
    if(response.IsSuccessStatusCode)
    {
        // How should I read and parse JSON fields from here
    }
}
 

`

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

1. Реальный ответ здесь заключается в использовании реальной библиотеки json, такой как JSON.NET это, вероятно, самый загружаемый пакет nuget всех времен с 978 миллионами загрузок на сегодняшний день.

Ответ №1:

Вы можете использовать ReadFromJsonAsync со следующими моделями

 HttpResponseMessage res = await client.GetAsync(URLParameters);
if (res.IsSuccessStatusCode)
{
  return await res.Content.ReadFromJsonAsync<Article>();
}


public class Data
{
      public string title { get; set; }
      public string url { get; set; }
      public string author { get; set; }
      public int num_comments { get; set; }
      public object story_id { get; set; }
      public object story_title { get; set; }
      public object story_url { get; set; }
      public object parent_id { get; set; }
      public int created_at { get; set; }
}

public class Article
{
      public int page { get; set; }
      public int per_page { get; set; }
      public int total { get; set; }
      public int total_pages { get; set; }
      public List<Data> data { get; set; }
}
 

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

1. Это существует только в .NET 5 и явно не использует System.Runtime. Сериализация. Json

Ответ №2:

Пожалуйста, попробуйте это. Используемое пространство имен: System.Runtime.Сериализация.Json

         HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("https://jsonmock.hackerrank.com/api/articles?author=epagaamp;page=0");
        string URLParameters = "?author=epagaamp;page=0";

        // Add an Accept header for JSON format.
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        HttpResponseMessage response = client.GetAsync(URLParameters).Resu<

        string jsonString = string.Empty;
        if (response.IsSuccessStatusCode)
        {
            // How should I read and parse JSON fields from here
            jsonString = response.Content.ReadAsStringAsync().Resu<
        }

        // Make a stream to read from.
        MemoryStream memoryStream = new MemoryStream();
        StreamWriter writer = new StreamWriter(memoryStream);
        writer.Write(jsonString);
        writer.Flush();
        memoryStream.Position = 0;

        // Deserialize from the stream.
        DataContractJsonSerializer serializer
            = new DataContractJsonSerializer(typeof(Article));

        Article articles = (Article)serializer.ReadObject(memoryStream);

        var page = articles.page;
        var perPage = articles.per_page;
        var total = articles.total;
        var totalPages = articles.total_pages;

        // Read data from the list
        foreach (var articleData in articles.data)
        {
            var title = articleData.title;
            var author = articleData.author;                
            var url = articleData.url;
            var numComments = articleData.num_comments;
            var storyId = articleData.story_id;
            var storyTitle = articleData.story_title;
            var storyUrl = articleData.story_url;
            var parentId = articleData.parent_id;
            var createdAt = articleData.created_at;
        }



    [DataContract()]
    public class Data
    {
        [DataMember]
        public string title { get; set; }
        [DataMember]
        public string url { get; set; }
        [DataMember]
        public string author { get; set; }
        [DataMember]
        public int num_comments { get; set; }
        [DataMember]
        public object story_id { get; set; }
        [DataMember]
        public object story_title { get; set; }
        [DataMember]
        public object story_url { get; set; }
        [DataMember]
        public object parent_id { get; set; }
        [DataMember]
        public int created_at { get; set; }
    }

    [DataContract()]
    public class Article
    {
        [DataMember]
        public int page { get; set; }
        [DataMember]
        public int per_page { get; set; }
        [DataMember]
        public int total { get; set; }
        [DataMember]
        public int total_pages { get; set; }
        [DataMember]
        public List<Data> data { get; set; }
    }
 

Ответ №3:

Я действительно предложил бы использовать библиотеку, подобную json.Сеть, делает все это проще ..

Вы можете работать с элементом XElement следующим образом:

 var jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(json), new System.Xml.XmlDictionaryReaderQuotas());
var xe = XElement.Load(jsonReader);
foreach (var data in xe.Descendants("data"))
{
  var title = data.Element("title").Value;
}
 

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

1. Нет смысла работать с элементом XElement при использовании json, когда вы можете просто десериализоваться в класс

2. Я просто устал отвечать на этот вопрос .. «Я хочу знать, как проанализировать ответ JSON с помощью System.Runtime. Сериализация. Пространство имен Json.» Всегда может быть причина 😉

3. в любом случае объединение XML с json не является хорошей идеей. Это просто вода и масло.