#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 не является хорошей идеей. Это просто вода и масло.