ASP.Net Core WebAPI is being built to fetch JSON from external REST API endpoint. I would like to save the JSON and reload it
At present, I am fetching the JSON from an external REST API endpoint using the following code:
public async Task<List<Weather>> Get(string cities)
{
List<Weather> weathers = new List<Weather>();
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
foreach (var city in cities.Split(";"))
{
string APIURL = $"?key={this.apiKey}&q={city}";
var response = await _httpClient.GetAsync(APIURL);
if (response.IsSuccessStatusCode)
{
var responses = await response.Content.ReadAsStreamAsync();
var weather = await JsonSerializer.DeserializeAsync<Weather>(responses, options);
weathers.Add(weather);
}
}
return weathers;
}
that returns the following JSON
[
{
"location":{
"name":"Chennai",
"region":"Tamil Nadu",
...
},
"current":{
"last_updated_epoch":1663601400,
"last_updated":"2022-09-19 21:00",
...
}
},
{
"location":{
"name":"Mumbai",
"region":"Maharashtra",
..
},
"current":{
"last_updated_epoch":1663602300,
"last_updated":"2022-09-19 21:15",
..
}
}
]
How can I export and import JSON ?
Update: I have updated the code as mentioned below
public static class JsonFileUtils
{
private static readonly JsonSerializerSettings _options
= new() { NullValueHandling = NullValueHandling.Ignore };
public static void StreamWrite(object obj, string fileName)
{
using var streamWriter = File.CreateText(fileName);
using var jsonWriter = new JsonTextWriter(streamWriter);
JsonSerializer.CreateDefault(_options).Serialize(jsonWriter, obj);
}
public static async Task StreamWriteAsync(object obj, string fileName)
{
await Task.Run(() => StreamWrite(obj, fileName));
}
}
and used it like
public async Task<List<Weather>> Get(string cities)
{
List<Weather> weathers = new List<Weather>();
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
foreach (var city in cities.Split(";"))
{
string APIURL = $"?key={this.apiKey}&q={city}";
var response = await _httpClient.GetAsync(APIURL);
if (response.IsSuccessStatusCode)
{
var responses = await response.Content.ReadAsStreamAsync();
var weather = await JsonSerializer.DeserializeAsync<Weather>(responses, options);
weathers.Add(weather);
}
}
var fileName = "weathers.json";
await JsonFileUtils.StreamWriteAsync(weathers, fileName);
return weathers;
}
to upload the file
[HttpPost("upload", Name = "upload")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List<Weather>))]
[ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
public async Task<IActionResult> UploadFile(
IFormFile file,
CancellationToken cancellationToken)
{
string fileContent = null;
using (var reader = new StreamReader(file.OpenReadStream()))
{
fileContent = reader.ReadToEnd();
}
var result = JsonConvert.DeserializeObject<List<Weather>>(fileContent);
return Ok(result);
}