迭代JObject键

时间:2018-05-21 10:28:40

标签: c# json.net

我有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 =>平衡。

还有其他合法方式吗?

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