c# - 来自 Api 的数据,显示多个没有数组的对象。是否应该为每个对象单独创建类
问题描述
我有来自 api 的以下数据,它给了我以下数据。
我想访问每个日期下的个人数据,并使用 c# 将其放入 Unity 中的图表中。
当我检查示例时,我可以找到仅涉及数组的示例。但是这个 api 只作为单个对象抛出。现在我应该根据个人日期创建个人课程吗?我有近 250 个日期需要从中提取数据。
{
"Meta Data": {
"1. Information": "Weekly Adjusted Prices and Volumes",
"2. Symbol": "MSFT",
"3. Last Refreshed": "2018-06-13",
"4. Time Zone": "US/Eastern"
},
"Weekly Adjusted Time Series": {
"2018-06-13": {
"1. open": "101.3700",
"2. high": "102.0100",
"3. low": "100.5600",
"4. close": "100.8500",
"5. adjusted close": "100.8500",
"6. volume": "70511616",
"7. dividend amount": "0.0000"
},
"2018-06-08": {
"1. open": "101.2600",
"2. high": "102.6900",
"3. low": "100.3800",
"4. close": "101.6300",
"5. adjusted close": "101.6300",
"6. volume": "122316267",
"7. dividend amount": "0.0000"
},
"2018-06-01": {
"1. open": "97.8400",
"2. high": "100.8600",
"3. low": "97.2300",
"4. close": "100.7900",
"5. adjusted close": "100.7900",
"6. volume": "113626024",
"7. dividend amount": "0.0000"
},
"2018-05-25": {
"1. open": "97.0000",
"2. high": "98.9800",
"3. low": "96.3200",
"4. close": "98.3600",
"5. adjusted close": "98.3600",
"6. volume": "101128083",
"7. dividend amount": "0.0000"
}
}}
解决方案
好的。首先你的json很伤脑筋。如果可以修复它,请执行以下操作:
- 您的键中不应有索引。
Weekly Adjusted Time Series
应该是一个数组。- 日期不应该是键,而应该是对象内部的值。像这样的东西:
{ "date": "2018-05-25", "open": "97.0000", [...] }
好吧,如果您无法修复 json,这是一个解决方案,我不确定它是否很棒。我希望别人能提供更好的东西。开始了:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters = {
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
public class Welcome
{
[JsonProperty("Meta Data")]
public MetaData MetaData { get; set; }
// we save it for a second deserialize
[JsonProperty("Weekly Adjusted Time Series")]
private JObject JWeeklyAdjustedTimeSeries { get; set; }
// this is the object as it should be
public IEnumerable<WeeklyAdjustedTime> WeeklyAdjustedTimeSeries { get; set; }
public static Welcome FromJson(string json)
{
// first pass
var welcome = JsonConvert.DeserializeObject<Welcome>(json, Converter.Settings);
// second pass
welcome.WeeklyAdjustedTimeSeries = welcome.JWeeklyAdjustedTimeSeries.ToObject<Dictionary<string, JObject>>().Select(x => {
var wat = x.Value.ToObject<WeeklyAdjustedTime>();
return new WeeklyAdjustedTime
{
Date = x.Key,
Open = wat.Open,
High = wat.High,
Low = wat.Low,
Close = wat.Close,
AdjustedClose = wat.AdjustedClose,
Volume = wat.Volume,
DividendAmount = wat.DividendAmount
};
});
return welcome;
}
}
public class MetaData
{
[JsonProperty("1. Information")]
public string Information { get; set; }
[JsonProperty("2. Symbol")]
public string Symbol { get; set; }
[JsonProperty("3. Last Refreshed")]
public DateTimeOffset LastRefreshed { get; set; }
[JsonProperty("4. Time Zone")]
public string TimeZone { get; set; }
}
public class WeeklyAdjustedTime
{
public string Date { get; set; }
[JsonProperty("1. open")]
public string Open { get; set; }
[JsonProperty("2. high")]
public string High { get; set; }
[JsonProperty("3. low")]
public string Low { get; set; }
[JsonProperty("4. close")]
public string Close { get; set; }
[JsonProperty("5. adjusted close")]
public string AdjustedClose { get; set; }
[JsonProperty("6. volume")]
public string Volume { get; set; }
[JsonProperty("7. dividend amount")]
public string DividendAmount { get; set; }
}
如何使用它:
var welcome = Welcome.FromJson(json); // put your json here
Console.WriteLine(welcome.MetaData.Information);
Console.WriteLine(welcome.WeeklyAdjustedTimeSeries.First().Date);
Console.WriteLine(welcome.WeeklyAdjustedTimeSeries.First().Open);
推荐阅读
- html - 显示/隐藏javascript函数
- c# - 如何在具有不同计时器持续时间的.net核心的后台服务中运行多个任务
- javascript - 在 AJAX 网站上使用动态注入的 Ninja Forms
- exec - Puppet:如果另一个 Exec 资源失败,如何执行 Exec 资源
- java - 如何返回 Arraylists 的对象数组
- python - RaspberryPi Python TypeError:*:'NoneType'和'float'不支持的操作数类型
- git - 如果目录被命名,GitKraken 拒绝打开本地存储库
.git - 任何解决方法? - r - R-Markdown:渲染为 PDF 并附加到现有的 PDF
- latex - 在 TeX 中使用 xcolor 渲染颜色不准确
- r - 如何使用 xlab 和 ylab 但没有 ylim 和 xlim 在 R 中绘制空图?