Как конвертировать динамический JSON в объект C # - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь преобразовать объект ниже JSON в класс C #. Я мог бы получить эквивалент C # для фильтра , но не для sort .

В случае filter JSON object; andOr, openCondition, и т. Д. Являются статическими. Следовательно, я мог бы генерировать класс C #.

Но для sort JSON object; accountName и tradeDate не являются статичными. Эти поля полностью соответствуют требованиям пользователя. Они могут измениться как некоторые другие поля для некоторого другого ввода. Следовательно, я не понимаю, как я могу создать класс C # для этого sort объекта JSON. Может кто-нибудь предложить мне, как это сделать?

{
    "filter": [
        {
            "andOr": "",
            "openCondition": false,
            "columnName": "accountName",
            "operator": "eq",
            "value": "KATHERINE",
            "closeCondition": false
        }
    ],
    "sort": {
            "accountName": "asc",
            "tradeDate": "desc"       
    },
    "pageIndex": 1,
    "pageSize": 75
}

Я пытался создать SortCriteria класс, как показано ниже. Но он не соответствует объекту сортировки JSON.

public class SortCriteria
{
    public string ColumnName { get; set; }
    public string SortOrder { get; set; }
}

Может кто-нибудь подсказать, как мне решить эту проблему.

Ответы [ 3 ]

1 голос
/ 05 октября 2019

Если ваши свойства json не являются фиксированными и могут со временем меняться, то вместо создания отдельного класса вы можете использовать dynamic.

Например,

string jsonString = @"{
    sort: {
      accountName: 'asc',
      tradeDate: 'desc'       
    }
}";


JObject obj = JObject.Parse(jsonString);
Console.WriteLine($"AccountNumber: {obj["sort"]["accountName"]}");

с использованием Jsonпуть,

Console.WriteLine($"AccountNumber: {obj.SelectToken("$.sort.accountName")}");

.Net Fiddle

1 голос
/ 05 октября 2019

Вы можете десериализовать любой объект JSON в Dictionary<string,object> или, если вы знаете тип значения, вы можете использовать этот тип значения вместо object.

В этом случае значение сортировки будет только "asc" или "desc", поэтому мы можем использовать string или (лучше) an enum

public enum SortDirection
{
    Asc,
    Desc,
}

Класс будет выглядеть как

public class Data
{
    ...
    [JsonProperty( "sort" )]
    public Dictionary<string,SortDirection> Sort { get; set; }
    ...
}

минимальный пример

var json = "{\"sort\":{\"accountName\":\"asc\",\"tradeDate\":\"desc\"}}";
var obj = JsonConvert.DeserializeObject<Data>(json);

Пример скрипта .net

1 голос
/ 05 октября 2019

Вы можете использовать Dictionary JsonExtensionDataAttribute ) для случаев, когда свойства НЕ являются фиксированными, например, в Sort. Например,

public class Filter
{
    public string andOr { get; set; }
    public bool openCondition { get; set; }
    public string columnName { get; set; }
    public string @operator { get; set; }
    public string value { get; set; }
    public bool closeCondition { get; set; }
}

public class Sort
{
    [JsonExtensionData]
    public Dictionary<string,object> RandomKeyValuePair {get;set;}
}

public class RootObject
{
    public List<Filter> filter { get; set; }
    public Sort sort { get; set; }
    public int pageIndex { get; set; }
    public int pageSize { get; set; }
}

Пример вывода

enter image description here

...