【问题标题】:Iterating JObject Keys迭代 JObject 键
【发布时间】:2018-05-21 19:10:47
【问题描述】:

https://gate.io/api2#trade API 返回以下JObject。我如何遍历每个作为单独硬币的键也得到它的值。

我尝试使用 Newtonsoft JObject 解析它,如下所示:

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 不能访问键值。我不知道如何进一步解析它。

从 gateio api 收到的 JSON:

{
    "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 => 余额。

还有其他合法的方式吗?

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

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

    【讨论】:

    • @stuartd OP 仅枚举 available 属性(在他的代码示例中,如果您向右滚动,您将看到 ["available"]
    • foreach (var item in coinData["available"].OfType()) {} 谢谢
    【解决方案2】:

    我建议通过强制转换为JObject,非常明确地期望“可用”的结果是另一个对象。然后您可以调用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}");
            }    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 1970-01-01
      • 2011-03-21
      • 2010-12-02
      • 2021-08-31
      • 1970-01-01
      • 2017-09-08
      • 2021-06-26
      • 2015-01-18
      相关资源
      最近更新 更多