Как выбрать определенный ключ из строки Json - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь получить значение "accountBalance", но помимо этого я получаю также кучу нежелательных "0". Кажется, я получаю «0» для каждого элемента, который не имеет ключа «accountBalance». Как можно выбрать только те элементы, которые содержат ключ «accountBalance».

Мой код:

var resultOpTrades = JsonConvert.DeserializeObject<RootObject>(result);//Deserialize Json
var pricelist = resultOpTrades.transactions.Select(p => p.accountBalance).ToList().Select(s => Convert.ToDouble(s)).ToList();
pricelist.ForEach(Console.WriteLine);

JSON:

{"transactions": [
{
  "type": "CLIENT_CONFIGURE",
  "marginRate": "0.02",
  "alias": "Test USD",
  "id": "2",
  "userID": 4455670,
  "accountID": "101-004-4455670-004",
  "batchID": "1",
  "requestID": "1789786643428780285",
  "time": "2018-01-22T13:01:57.930423995Z"
},
{
  "accountBalance": "2000.0000",
  "type": "TRANSFER_FUNDS",
  "amount": "2000.0000000000",
  "fundingReason": "ADJUSTMENT",
  "id": "3",
  "userID": 4455670,
  "accountID": "101-004-4455670-004",
  "batchID": "3",
  "requestID": "1735743448013647784",
  "time": "2018-01-22T13:02:24.580177329Z"
},
{
  "type": "MARKET_ORDER",
  "instrument": "EUR_JPY",
  "units": "-2000",
  "timeInForce": "FOK",
  "positionFill": "DEFAULT",
  "reason": "CLIENT_ORDER",
  "id": "4",
  "userID": 4455670,
  "accountID": "101-004-4455670-004",
  "batchID": "4",
  "requestID": "60404387589188847",
  "time": "2018-01-22T13:06:12.138121604Z"
},
{
  "type": "ORDER_FILL",
  "orderID": "4",
  "instrument": "EUR_JPY",
  "units": "-2000",
  "price": "135.627",
  "pl": "0.0000",
  "financing": "0.0000",
  "commission": "0.0000",
  "accountBalance": "2000.0000",
  "gainQuoteHomeConversionFactor": "0.009022013713",
  "lossQuoteHomeConversionFactor": "0.009023071995",
  "guaranteedExecutionFee": "0.0000",
  "halfSpreadCost": "0.1353",
  "fullVWAP": "135.627",
  "reason": "MARKET_ORDER",
  "tradeOpened": {
    "price": "135.627",
    "tradeID": "5",
    "units": "-2000",
    "guaranteedExecutionFee": "0.0000",
    "halfSpreadCost": "0.1353"
  },
  "fullPrice": {
    "closeoutBid": "135.627",
    "closeoutAsk": "135.642",
    "timestamp": "2018-01-22T13:05:56.780436649Z",
    "bids": [
      {
        "price": "135.627",
        "liquidity": "10000000"
      }
    ],
    "asks": [
      {
        "price": "135.642",
        "liquidity": "10000000"
      }
    ]
  },
  "id": "5",
  "userID": 4455670,
  "accountID": "101-004-4455670-004",
  "batchID": "4",
  "requestID": "60404387589188847",
  "time": "2018-01-22T13:06:12.138121604Z"
},
{
  "type": "MARKET_ORDER",
  "instrument": "EUR_JPY",
  "units": "2000",
  "timeInForce": "FOK",
  "positionFill": "REDUCE_ONLY",
  "reason": "TRADE_CLOSE",
  "tradeClose": {
    "units": "ALL",
    "tradeID": "5"
  },
  "id": "6",
  "userID": 4455670,
  "accountID": "101-004-4455670-004",
  "batchID": "6",
  "requestID": "60404387832520278",
  "time": "2018-01-22T13:07:10.544407912Z"
},],"lastTransactionID": "22083"}

Результат я получаю : 0, 2000, 0, 2000, 0,

Ответы [ 3 ]

1 голос
/ 07 марта 2020

Вы можете использовать Json.Linq для анализа JSON в JObject, затем выполнить итерацию свойства transactions и получить accountBalance значения

var json = JObject.Parse(result));
foreach (var item in json["transactions"])
{
    if (item["accountBalance"] != null)
    {
        Console.WriteLine(item["accountBalance"].Value<double>());
    }
}
0 голосов
/ 07 марта 2020

Здравствуйте @Diana M00nshine,

Из того, что я понял, вы хотите принимать только те транзакции, для которых установлено поле accountBalance.

Сначала я бы предложил вам создать этот класс для отражать схему вашего поля json массива, называемого «транзакции».

class Transaction
{
    public string accountBalance { get; set; }
    public string type { get; set; }
    public string marginRate { get; set; }
    public string alias { get; set; }
    public string id { get; set; }
    public int userID { get; set; }
    public string accountID { get; set; }
    public string batchID { get; set; }
    public string requestID { get; set; }
    public string time { get; set; }
}

Чтобы получить все транзакции, для которых свойство accountBalance определено в строке JSON, вы можете сделать это, как показано ниже:

  1. Анализ строки json
  2. Возьмите токен транзакции и приведите его к IEnumerable
  3. Затем для каждого элемента внутри токена транзакции вы преобразуете их в объект класса Transaction, который я включил в исходный код выше.
  4. Приведение к списку объектов транзакций
var json = JObject.Parse(jsonString);
List<Transaction> transactionsWithAccountBalance = json["transactions"].AsJEnumerable()
                                                        .Where(t => t["accountBalance"] != null)
                                                        .Select(t => t.ToObject<Transaction>())
                                                        .ToList();

Если вам нужны только транзакции, для которых не только ключевой accountBalance установлен в json, но также отличается от нулевого или пустого , вы можете обновить условие where следующим образом:

.Where(t => t["accountBalance"] != null && string.IsNullOrEmpty(t["accountBalance"].Value<string>()))

Затем, если вам нужен список со всеми остатками на счетах ваших транзакций, вы можете сделать:

var priceList = transactionsWithAccountBalance.Select(t => t.accountBalance).ToList();

У меня есть включил этот небольшой тестовый класс, чтобы вы могли легко попробовать мое решение. Вы можете видеть, что в списке будут присутствовать только транзакции, которые имеют интересующий ключ в наборе файлов json.

class Program
{
    static void Main(string[] args)
    {
        string jsonString = @"{
            ""transactions"": [
            {
                ""type"": ""CLIENT_CONFIGURE"",
                ""marginRate"": ""0.02"",
                ""alias"": ""Test USD"",
                ""id"": ""2"",
                ""userID"": 4455670,
                ""accountID"": ""101-004-4455670-004"",
                ""batchID"": ""1"",
                ""requestID"": ""1789786643428780285"",
                ""time"": ""2018-01-22T13:01:57.930423995Z""
            },
            {
                ""accountBalance"": ""2000.0000"",
                ""type"": ""TRANSFER_FUNDS"",
                ""amount"": ""2000.0000000000"",
                ""fundingReason"": ""ADJUSTMENT"",
                ""id"": ""3"",
                ""userID"": 4455670,
                ""accountID"": ""101-004-4455670-004"",
                ""batchID"": ""3"",
                ""requestID"": ""1735743448013647784"",
                ""time"": ""2018-01-22T13:02:24.580177329Z""
            },
            {
                ""type"": ""MARKET_ORDER"",
                ""instrument"": ""EUR_JPY"",
                ""units"": ""-2000"",
                ""timeInForce"": ""FOK"",
                ""positionFill"": ""DEFAULT"",
                ""reason"": ""CLIENT_ORDER"",
                ""id"": ""4"",
                ""userID"": 4455670,
                ""accountID"": ""101-004-4455670-004"",
                ""batchID"": ""4"",
                ""requestID"": ""60404387589188847"",
                ""time"": ""2018-01-22T13:06:12.138121604Z""
            },
            {
                ""type"": ""ORDER_FILL"",
                ""orderID"": ""4"",
                ""instrument"": ""EUR_JPY"",
                ""units"": ""-2000"",
                ""price"": ""135.627"",
                ""pl"": ""0.0000"",
                ""financing"": ""0.0000"",
                ""commission"": ""0.0000"",
                ""accountBalance"": ""2000.0000"",
                ""gainQuoteHomeConversionFactor"": ""0.009022013713"",
                ""lossQuoteHomeConversionFactor"": ""0.009023071995"",
                ""guaranteedExecutionFee"": ""0.0000"",
                ""halfSpreadCost"": ""0.1353"",
                ""fullVWAP"": ""135.627"",
                ""reason"": ""MARKET_ORDER"",
                ""tradeOpened"": {
                ""price"": ""135.627"",
                ""tradeID"": ""5"",
                ""units"": ""-2000"",
                ""guaranteedExecutionFee"": ""0.0000"",
                ""halfSpreadCost"": ""0.1353""
                },
                ""fullPrice"": {
                ""closeoutBid"": ""135.627"",
                ""closeoutAsk"": ""135.642"",
                ""timestamp"": ""2018-01-22T13:05:56.780436649Z"",
                ""bids"": [
                    {
                    ""price"": ""135.627"",
                    ""liquidity"": ""10000000""
                    }
                ],
                ""asks"": [
                    {
                    ""price"": ""135.642"",
                    ""liquidity"": ""10000000""
                    }
                ]
                },
                ""id"": ""5"",
                ""userID"": 4455670,
                ""accountID"": ""101-004-4455670-004"",
                ""batchID"": ""4"",
                ""requestID"": ""60404387589188847"",
                ""time"": ""2018-01-22T13:06:12.138121604Z""
            },
            {
                ""type"": ""MARKET_ORDER"",
                ""instrument"": ""EUR_JPY"",
                ""units"": ""2000"",
                ""timeInForce"": ""FOK"",
                ""positionFill"": ""REDUCE_ONLY"",
                ""reason"": ""TRADE_CLOSE"",
                ""tradeClose"": {
                ""units"": ""ALL"",
                ""tradeID"": ""5""
                },
                ""id"": ""6"",
                ""userID"": 4455670,
                ""accountID"": ""101-004-4455670-004"",
                ""batchID"": ""6"",
                ""requestID"": ""60404387832520278"",
                ""time"": ""2018-01-22T13:07:10.544407912Z""
            }
            ],
            ""lastTransactionID"": ""22083""
        }";

        var json = JObject.Parse(jsonString);
        List<Transaction> transactionsWithAccountBalance = json["transactions"].AsJEnumerable()
                                                                .Where(t => t["accountBalance"] != null)
                                                                .Select(t => t.ToObject<Transaction>())
                                                                .ToList();

        var priceList = transactionsWithAccountBalance.Select(t => t.accountBalance).ToList();

        Console.ReadKey();
    }
}

Не забудьте добавить эти пространства имен для того, чтобы скомпилировать программный класс:

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
0 голосов
/ 07 марта 2020

Отфильтруйте прайс-лист с нулевым значением, используя Where in Linq

var resultOpTrades = JsonConvert.DeserializeObject<RootObject>(result);//Deserialize Json
var pricelist = resultOpTrades.transactions.Where(x => x.accountBalance != 0).Select(p => Convert.ToDouble(p.accountBalance)).ToList();
pricelist.ForEach(Console.WriteLine);
...