如何从JArray选择元素的值

3

我在使用C#(VS 2017,.Net 4.6)代码时遇到了一些问题。如果有人能帮忙就太好了。我有一个JSON文件:

{
  "makerCommission": 10,
  "takerCommission": 10,
  "buyerCommission": 0,
  "updateTime": 1540015045989,
  "balances": [
    {
      "asset": "BTC",
      "free": "0.22222222",
      "locked": "0.00000000"
    },
    {
      "asset": "LTC",
      "free": "2.00000000",
      "locked": "3.00000000"
    },
    {
      "asset": "ETH",
      "free": "4.00000000",
      "locked": "5.00000000"
    }
  ]
}

我想使用以下方法获取任何币种的“free”价值:
result = (dynamic)JArray.Parse(MyData)

我不想获取全部的免费价值。如果我选择比特币,怎样才能获取0.22222222呢?

3个回答

9
首先,您的整个JSON不表示一个数组,而是表示包含数组的对象。因此,您需要使用JObject.Parse而不是JArray.Parse。
您可以使用以下LINQ-to-JSON代码在数组中查找特定的asset,然后从中获取free值:
JObject obj = JObject.Parse(json);               // Parse the JSON to a JObject

string free = obj["balances"]                    // Navigate down to the "balances" array
    .Where(jt => (string)jt["asset"] == "BTC")   // Find the object(s) containing the asset you want
    .Select(jt => (string)jt["free"])            // From those get the "free" value
    .FirstOrDefault();                           // Take the first of those

小提琴: https://dotnetfiddle.net/uFjSib


0
你已经接近成功了。你有一个包含数组的JSON对象,所以你需要先解析对象,然后使用名称balances访问数组。
var result = (dynamic)JObject.Parse(MyData);

Console.WriteLine(result.balances); // output JArray ...

然后您可以像这样从数组中获取值:

Console.WriteLine(String.Format("{0} - {1}", result.balances[2].asset, result.balances[2].free));

输出数组的第三个元素:

ETH - 4.00000000

为了仅获取BTC条目,您需要过滤数组:
foreach (var balance in result.balances)
{
    if (balance.asset == "BTC")
    {
        Console.WriteLine(balance.free);
    }
}

更好的方法是创建一个表示对象结构并进行解析的类。然后使用LINQ更容易进行过滤:
public class BalanceItem
{
    public string asset { get; set; }
    public double free { get; set; }
    public double locked { get; set; }
}


public class Items
{
    public List<BalanceItem> balances { get; set; }
}

var items = JsonConvert.DeserializeObject<Items>(MyData);
var btc = items.balances.FirstOrDefault (b => b.asset == "BTC");
if (btc != null)
{
    Console.WriteLine(btc.free);
}

输出为:0.22222222


0

或者,您可以使用JToken

以下脚本可为您提供所需的值。也许不是概念上最好的方法,但确实很直观。

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
                    
public class Program
{
    public static void Main()
    {
        string json = @"
          {
              ""makerCommission"": 10,
              ""takerCommission"": 10,
              ""buyerCommission"": 0,
              ""updateTime"": 1540015045989,
              ""balances"": [
                {
                  ""asset"": ""BTC"",
                  ""free"": ""0.22222222"",
                  ""locked"": ""0.00000000""
                },
                {
                  ""asset"": ""LTC"",
                  ""free"": ""2.00000000"",
                  ""locked"": ""3.00000000""
                },
                {
                  ""asset"": ""ETH"",
                  ""free"": ""4.00000000"",
                  ""locked"": ""5.00000000""
                }
              ]
            }";

        var value = "";
        JToken token = JToken.Parse(json);
        var balances = token.SelectToken("balances");
        foreach(var balance in balances){
            if((string)balance.SelectToken("asset") == "BTC"){
                value = (string)balance.SelectToken("free");
            }
        }
        Console.WriteLine("value: " + value);
    }
}

受到这个帖子的启发


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接