我有https://gate.io/api2#trade API返回以下JObject
。如何遍历每个单独硬币的键也可以获得它的价值。
我尝试使用Newtonsoft JObject
Parse解析它,如下所示:
var coinData = JObject.Parse(@"{
""result"": ""true"",
""available"": {
""BTC"": ""0.83337671"",
""LTC"": ""94.364"",
""ETH"": ""0.07161"",
""ETC"": ""82.35029899""
},
""locked"": {
""BTC"": ""0.0002"",
""YAC"": ""10.01""
}
}")["available"];
foreach (JToken item in coinData)
{
item.Key
}
但后来JToken
无法访问键值。我不知道如何进一步解析它。
JSON从gateio api收到:
{
"result": "true",
"available": {
"BTC": "0.83337671",
"LTC": "94.364",
"ETH": "0.07161",
"ETC": "82.35029899"
},
"locked": {
"BTC": "0.0002",
"YAC": "10.01"
}
}
编辑:我应该在循环迭代时用':'来打破它吗?如果我打破它并替换引号,这是有效的。
foreach (JToken item in coinData)
{
var data = item.ToString().Replace("\"", String.Empty).Split(':');
}
var数据有两部分,1 =>硬币名称,2 =>平衡。
还有其他合法方式吗?
答案 0 :(得分:2)
JToken
是所有类型的json标记的基类。在您的情况下,虽然您只需要json属性,但您需要按更窄的类型 - JProperty
进行过滤。您可以过滤以仅包含此类属性标记:
foreach (var item in coinData.OfType<JProperty>()) {
string coinName = item.Name;
// to parse as decimal
decimal balance = item.Value.Value<decimal>();
// or as string
string balanceAsString = item.Value.Value<string>();
}
答案 1 :(得分:0)
我建议通过强制转换为JObject
来明确期望将“available”的结果作为另一个对象。然后,您可以致电Properties()
获取其属性,每个属性为JProperty
。以下是一个完整的示例:
using System;
using Newtonsoft.Json.Linq;
class Program
{
public static void Main()
{
string json = @"{
'result': 'true',
'available': {
'BTC': '0.83337671',
'LTC': '94.364',
'ETH': '0.07161',
'ETC': '82.35029899'
},
'locked': {
'BTC': '0.0002',
'YAC': '10.01'
}
}".Replace('\'', '"');
JObject root = JObject.Parse(json);
JObject coins = (JObject) root["available"];
foreach (JProperty property in coins.Properties())
{
string name = property.Name;
string value = (string) property.Value;
Console.WriteLine($"Name: {name}; Value: {value}");
}
}
}