C# 从最后一个 JSON 对象迭代到第一个
C# Iterate from Last JSON Object to First
有没有什么好的方法可以从最后到第一个遍历反序列化的 JSON 对象?即下面的代码我可以从头到尾迭代并记录'n'个值,直到它满足我的计数条件以供进一步处理:
protected void testButton_Click(object sender, EventArgs e)
{
List<decimal> priceHistory = new List<decimal>();
var client = new RestClient("https://api.tdameritrade.com/v1/marketdata/" + inputSymbol + "/pricehistory?periodType=year&period=1&frequencyType=daily&frequency=1&needExtendedHoursData=false");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer " + ReadAccessToken());
request.AddParameter("text/plain", "", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
dynamic history = JsonConvert.DeserializeObject<JObject>(response.Content);
int count = 0;
foreach (var child in history["candles"])
{
count += 1;
while (count <= 100)
{
decimal close = child["close"];
priceHistory.Add(close);
break;
}
}
decimal simpleMovingAverage = priceHistory.Average();
responseLabel.Text = simpleMovingAverage.ToString();
//output is taking the first 100 close prices returned from the JSON response and averaging those values.
}
但是,我找不到解决方案的是如何从最后一个嵌套的 JSON 对象开始并从后到前的样式添加值。我正在尝试将聚合从计算第一个嵌套对象 + 'n' 下一个值顺序到列表中的前一个值,到实际获取响应中的最后一个嵌套 JSON 对象并将其与其每个对象进行平均前 'n' 个值,直到满足计数条件。
编辑
JSON 任意'n' 周期的例子供参考:
{
"candles": [
{
"open": 172.51,
"high": 176.36,
"low": 171.5,
"close": 171.86,
"volume": 2292877,
"datetime": 1582524000000
},
{
"open": 172.18,
"high": 172.945,
"low": 165.8,
"close": 166.65,
"volume": 2358560,
"datetime": 1582610400000
},
{
"open": 168.28,
"high": 169.38,
"low": 165.61,
"close": 166.92,
"volume": 2545782,
"datetime": 1582696800000
},
{
"open": 164.4,
"high": 166.55,
"low": 159.96,
"close": 159.99,
"volume": 2957507,
"datetime": 1582783200000
},
{
"open": 155.29,
"high": 158.92,
"low": 152.66,
"close": 156.48,
"volume": 3053876,
"datetime": 1582869600000
},
{
"open": 157.92,
"high": 164.0,
"low": 156.55,
"close": 163.92,
"volume": 2532128,
"datetime": 1583128800000
}
],
"symbol": "DE",
"empty": false
}
可以使用JArrayclass的Reverse()
方法。只需将 history["candles"]
JToken
转换为 JArray
,然后调用 reverse。
void ParseJson(string json)
{
var history = JObject.Parse(json);
var candles = (history["candles"] as JArray).Reverse();
foreach (var child in candles)
{
Console.WriteLine(child["close"].ToString());
}
Console.Read();
}
有没有什么好的方法可以从最后到第一个遍历反序列化的 JSON 对象?即下面的代码我可以从头到尾迭代并记录'n'个值,直到它满足我的计数条件以供进一步处理:
protected void testButton_Click(object sender, EventArgs e)
{
List<decimal> priceHistory = new List<decimal>();
var client = new RestClient("https://api.tdameritrade.com/v1/marketdata/" + inputSymbol + "/pricehistory?periodType=year&period=1&frequencyType=daily&frequency=1&needExtendedHoursData=false");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer " + ReadAccessToken());
request.AddParameter("text/plain", "", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
dynamic history = JsonConvert.DeserializeObject<JObject>(response.Content);
int count = 0;
foreach (var child in history["candles"])
{
count += 1;
while (count <= 100)
{
decimal close = child["close"];
priceHistory.Add(close);
break;
}
}
decimal simpleMovingAverage = priceHistory.Average();
responseLabel.Text = simpleMovingAverage.ToString();
//output is taking the first 100 close prices returned from the JSON response and averaging those values.
}
但是,我找不到解决方案的是如何从最后一个嵌套的 JSON 对象开始并从后到前的样式添加值。我正在尝试将聚合从计算第一个嵌套对象 + 'n' 下一个值顺序到列表中的前一个值,到实际获取响应中的最后一个嵌套 JSON 对象并将其与其每个对象进行平均前 'n' 个值,直到满足计数条件。
编辑
JSON 任意'n' 周期的例子供参考:
{
"candles": [
{
"open": 172.51,
"high": 176.36,
"low": 171.5,
"close": 171.86,
"volume": 2292877,
"datetime": 1582524000000
},
{
"open": 172.18,
"high": 172.945,
"low": 165.8,
"close": 166.65,
"volume": 2358560,
"datetime": 1582610400000
},
{
"open": 168.28,
"high": 169.38,
"low": 165.61,
"close": 166.92,
"volume": 2545782,
"datetime": 1582696800000
},
{
"open": 164.4,
"high": 166.55,
"low": 159.96,
"close": 159.99,
"volume": 2957507,
"datetime": 1582783200000
},
{
"open": 155.29,
"high": 158.92,
"low": 152.66,
"close": 156.48,
"volume": 3053876,
"datetime": 1582869600000
},
{
"open": 157.92,
"high": 164.0,
"low": 156.55,
"close": 163.92,
"volume": 2532128,
"datetime": 1583128800000
}
],
"symbol": "DE",
"empty": false
}
可以使用JArrayclass的Reverse()
方法。只需将 history["candles"]
JToken
转换为 JArray
,然后调用 reverse。
void ParseJson(string json)
{
var history = JObject.Parse(json);
var candles = (history["candles"] as JArray).Reverse();
foreach (var child in candles)
{
Console.WriteLine(child["close"].ToString());
}
Console.Read();
}