Вызовите класс как массив, только если вход-массив

#c# #arrays #json

Вопрос:

Я был в процессе создания алгоритма, но столкнулся с проблемой, которая остановила меня на полпути. Проблема связана со следующим ответом API:

 {
    "topic": "trade.BTCUSDT",
    "data": [
        {
            "symbol": "BTCUSDT",
            "tick_direction": "PlusTick",
            "price": 8098,
            "size": 328,
            "timestamp":"2020-03-30T02:21:06.000Z",
            "trade_time_ms":"1585534866418",
            "side":"Sell",
            "trade_id":"01e79e28-d1f4-59ac-b079-ca909606d91a"
        }
    ]
}
 

Изначально это не создавало никаких проблем, так как я называл данные массивом при десериализации с помощью Newtonsoft.Пакет Json и взял первую переменную, чтобы решить проблему. Я нахожусь в процессе объединения всех ответов и их сортировки в зависимости от темы ответа. Этот ответ является единственным ответом, в котором данные заключены в квадратные скобки, а не в фигурные скобки. Чтобы исправить это, я попытался отредактировать команду get; set; следующим образом, но вышло переполнение стека.

 public Data[] data { get { if (_data != null) { return new[] { _data }; } else { return data; } } set { if (value.Length == 1) { _data = value[0]; } else { data = value; } } } 
 

Мой вопрос в том, можно ли установить мой get; set; класс в класс данных как массив, если задан только один элемент?

Комментарии:

1. Можете ли вы показать другой вид json, который вы можете получить, пожалуйста? Трудно понять, в чем разница. Что вы хотите получить в каждом конкретном случае?

Ответ №1:

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

 public class Datum
{
    public string symbol { get; set; }
    public string tick_direction { get; set; }
    public int price { get; set; }
    public int size { get; set; }
    public DateTime timestamp { get; set; }
    public string trade_time_ms { get; set; }
    public string side { get; set; }
    public string trade_id { get; set; }
}

public class Trade
{
    public string topic { get; set; }
    public List<Datum> data { get; set; }
}
 

Комментарии:

1. Проблема в том, что другие десериализации используют одну версию данных, поэтому вся программа останавливается.

2. У вас не может быть свойства, которое может быть массивом или одним экземпляром. Вам потребуются два свойства или два класса.