JSON到对象C#(将复杂的API响应映射到C#对象) [英] JSON to object C# (mapping complex API response to C# object)
问题描述
我能够处理简单的JSON序列化和反序列化,但此API响应似乎并不复杂,我正在寻求有关解决该问题的理想方法的建议.
I am able to handle simple JSON serialization and deserialization but this API response seems little complicated, and I am seeking an advice as to what would be ideal approach to tackle this.
我正在尝试为MVC应用程序调用API. 目标是将API数据映射到模型. API端点为 https://www.alphavantage.co/query?function = TIME_SERIES_INTRADAY& symbol = MSFT& interval = 1min& apikey = MyAPIKey
I'm trying to call an API for MVC application. Goal is to map API data to model. API endpoint is https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=1min&apikey=MyAPIKey
这里的问题是:
- JSON数据键中包含空格.
- 当我尝试在Visual Studio中进行特殊粘贴时,它给了我很长时间 每个日期条目的类的列表分开,因为此API 调用返回有关日期的另一套信息.
- JSON data keys have white space in them.
- When I tried doing paste special in Visual studio, It gave me a long list of classes for each date entry separately, because this API call returns a separate set of information for date.
为解决第1点中说明的问题,我在课堂上使用了[JsonProperty("1. Information")]
.然后在我的代码中.
To solve problem explained in point 1, I used [JsonProperty("1. Information")]
in class. And in my code..
public async Task TSI()
{
HttpClient client = new HttpClient();
//Uri uri = new Uri("http://date.jsontest.com/");
Uri uri = new Uri("https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&apikey=demo");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
dynamic result = await response.Content.ReadAsAsync<object>();
IEnumerable<dynamic> dObj = JsonConvert.DeserializeObject<dynamic>(result.ToString());
IEnumerable<dynamic> t1 = dObj.FirstOrDefault();
IEnumerable<dynamic> t2 = dObj.LastOrDefault();
dynamic MetaData = t1.FirstOrDefault();
Rootobject ro = new Rootobject();
ro.MetaData = MetaData;
}
PS:我相对较新,可以进行API调用并进行处理.
PS: I'm relatively new to make API calls and handling them.
我可以打电话给
date.jsontest.com
date.jsontest.com
并将API数据映射到模型(这是我使用选择性粘贴创建的)
and map the API data to model (which I had created using paste special)
//API response
{
"time": "12:53:22 PM",
"milliseconds_since_epoch": 1504875202754,
"date": "09-08-2017"
}
//C# code to map to API data
public class sampleObject
{
public string time { get; set; }
public long milliseconds_since_epoch { get; set; }
public string date { get; set; }
}
我的RootObject看起来像这样:
My RootObject looks like this:
public class Rootobject
{
[JsonProperty("Meta Data")]
public MetaData MetaData { get; set; }
[JsonProperty("Time Series (1min)")]
public TimeSeries1Min TimeSeries1min { get; set; }
}
public class MetaData
{
[JsonProperty("1. Information")]
public string _1Information { get; set; }
[JsonProperty("2. Symbol")]
public string _2Symbol { get; set; }
[JsonProperty("3. Last Refreshed")]
public string _3LastRefreshed { get; set; }
[JsonProperty("4. Interval")]
public string _4Interval { get; set; }
[JsonProperty("5. Output Size")]
public string _5OutputSize { get; set; }
[JsonProperty("6. Time Zone")]
public string _6TimeZone { get; set; }
}
// I have so many of these sub-classes for dates, which again is an issue
public class TimeSeries1Min
{
public _20170907160000 _20170907160000 { get; set; }
public _20170907155900 _20170907155900 { get; set; }
....
....}
public class _20170907160000
{
public string _1open { get; set; }
public string _2high { get; set; }
public string _3low { get; set; }
public string _4close { get; set; }
public string _5volume { get; set; }
}
public class _20170907155900
{
public string _1open { get; set; }
public string _2high { get; set; }
public string _3low { get; set; }
public string _4close { get; set; }
public string _5volume { get; set; }
}
推荐答案
很难通过此json创建模型,但是您可以将这些数据转换为字典
It is hard to create a model from this json, but you can convert those data to dictionary
var jObj = JObject.Parse(json);
var metadata = jObj["Meta Data"].ToObject<Dictionary<string, string>>();
var timeseries = jObj["Time Series (1min)"].ToObject<Dictionary<string, Dictionary<string, string>>>();
这篇关于JSON到对象C#(将复杂的API响应映射到C#对象)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!