简体   繁体   English

JSON到对象C#(将复杂的API响应映射到C#对象)

[英]JSON to object C# (mapping complex API response to C# object)

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. 我能够处理简单的JSON序列化和反序列化,但是此API响应似乎并不复杂,我正在寻求有关解决该问题的理想方法的建议。

I'm trying to call an API for MVC application. 我正在尝试为MVC应用程序调用API。 Goal is to map API data to model. 目标是将API数据映射到模型。 API endpoint is https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=1min&apikey=MyAPIKey API端点为https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=1min&apikey=MyAPIKey

Troubles here are: 这里的问题是:

  1. JSON data keys have white space in them. JSON数据密钥中有空白。
  2. 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. 当我尝试在Visual Studio中进行特殊粘贴时,它为我分别为每个日期条目提供了很长的类列表,因为此API调用返回了一组单独的日期信息。

To solve problem explained in point 1, I used [JsonProperty("1. Information")] in class. 为了解决第1点中说明的问题,我在类中使用了[JsonProperty("1. Information")] 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: I'm relatively new to make API calls and handling them. PS:我相对较新,可以进行API调用并进行处理。

I was able to make a call to 我能够打电话给

date.jsontest.com date.jsontest.com

and map the API data to model (which I had created using paste special) 并将API数据映射到模型(这是我使用选择性粘贴创建的)

//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; }
    }

My RootObject looks like this: 我的RootObject看起来像这样:

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; }
    }

It is hard to create a model from this json, but you can convert those data to dictionary 很难从这个json创建模型,但是您可以将这些数据转换成字典

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>>>();

The following code should do what you want 下面的代码应该做你想要的

       if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();

            var obj = JsonConvert.DeserializeObject<Rootobject>(result);
            //No idea what you want to do with this line as there is no MetaData property on the root object
            obj.MetaData = MetaData;

        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM