Yusufmet
Yusufmet

Reputation: 135

How to select an element's value from a JArray

I'm having a bit of trouble with C# (VS 2017, .Net 4.6) code. It'd be great if someone could help. I have a JSON file:

{
  "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"
    }
  ]
}

I would like to retrieve the "free" value of any coin using:

result = (dynamic)JArray.Parse(MyData)

I do not want to retrieve all free values. How can I get 0.22222222, if I pick BTC?

Upvotes: 3

Views: 17320

Answers (3)

wueli
wueli

Reputation: 1219

Alternatively, you could use JToken

The following script gives you the wanted value. Maybe not the conceptually finest approach, but really intuitive.

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

Inspired by this post

Upvotes: 0

Brian Rogers
Brian Rogers

Reputation: 129787

First of all, your overall JSON does not represent an array, it represents an object which contains an array. So you would need to use JObject.Parse instead of JArray.Parse.

You can use the following LINQ-to-JSON code to find a specific asset in the array and then get the free value from it:

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

Fiddle: https://dotnetfiddle.net/uFjSib

Upvotes: 9

keenthinker
keenthinker

Reputation: 7830

You are almost there. You have a JSON object, that contains the array, so you need to parse first the Object and then access the array using the name balances.

var result = (dynamic)JObject.Parse(MyData);

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

You can then get the value from the array like this:

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

The output is the third element from the array:

ETH - 4.00000000

In order to get only the BTC entry you need to filter the array:

foreach (var balance in result.balances)
{
    if (balance.asset == "BTC")
    {
        Console.WriteLine(balance.free);
    }
}

A better approach would be to create a class that represents the object structure and parse it. The filtering then will be easier using 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);
}

The output is: 0.22222222

Upvotes: 0

Related Questions