Действительно динамические объекты C # - поворот данных с <n>количеством свойств (и динамическими именами свойств) - PullRequest
0 голосов
/ 08 февраля 2019

Должно быть элегантное решение этой проблемы, которое мне не хватает.То, что я ищу , кажется чрезвычайно простым, но я пока не нашел способ сделать это.

У меня есть следующий объект:

internal class OverrideValue
{
    public int RID { get; set; }
    public int PID { get; set; }
    public string Value { get; set; }
}

Данный RID может иметь несколько комбинаций PID / значение.Мне нужно вернуть динамически созданный (и именованный) список обратно клиенту с JSON.Итак, учитывая следующее:

var overrideList = new List<OverrideValue>()
{
    new OverrideValue() {RID = 1, PID = 1, Value = "200"},
    new OverrideValue() {RID = 1, PID = 2, Value = "250"},
    new OverrideValue() {RID = 2, PID = 1, Value = "200"},
    new OverrideValue() {RID = 2, PID = 3, Value = "300"},
    new OverrideValue() {RID = 2, PID = 4, Value = "255"}
};

Мне нужно вернуть объект, подобный этому:

{ "overrides":[
    { "RID":1, "PID_1":"200", "PID_2":"250" },
    { "RID":2, "PID_1":"200", "PID_3":"300", "PID_4":"255" }
]}

Если моя база данных возвращает PID 400 000, мне нужно, чтобы объект содержал свойствоназывается " PID_4000000 " со связанным значением.

Я понимаю, что безопасность типов - это огромная часть C #, но мне кажется нелепым, что мне приходится создавать JSON вручную для этой ситуации.Похоже, что для создания динамического объекта должен быть встроенный метод.Я пытался работать с ExpandoObject (), но все, что мне удалось дать, - это список пар ключ / значение Dictionary (), который бесполезен - при сериализации свойствами являются «ключ» и «значение».

Что сводится к тому, что я использую сетку, которая будет привязываться только к плоскому (одномерному) источнику данных JSON, и мне нужно построить сетку с любыми данными, которые попадутся мне на пути.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Это немного глупо, но должно дать вам достаточно, чтобы продолжить и адаптировать к вашим потребностям.Он использует Linq для группировки значений и словарей для хранения сгруппированных элементов.

Сначала нам нужен класс-обертка для правильного соответствия вашего вывода:

public class Output
{
    public IEnumerable<Dictionary<string, int>> Overrides { get; set; }
}

Теперь мы можем сгруппировать ваши данные:

//Grou pand aggregate the data
var results = overrideList
    .GroupBy(l => l.RID)
    .Select(l =>
    {
        var dictionary = new Dictionary<string, int>();
        dictionary.Add("RID", l.Key);
        foreach (var pidValue in l)
        {
            dictionary.Add($"PID_{pidValue.PID}", int.Parse(pidValue.Value));
        }
        return dictionary;
    });

//Throw the data into our output class
var output = new Output
{
    Overrides = results
};

//Convert to JSON
var json = JsonConvert.SerializeObject(output);

Это дает что-то вроде этого:

{"Overrides":[
    {"RID":1,"PID_1":200,"PID_2":250},
    {"RID":2,"PID_1":200,"PID_3":300,"PID_4":255}
]}
0 голосов
/ 08 февраля 2019

видя, как вы сохраняете свои данные, это представление json не является заданным по умолчанию, так как вы объединяете несколько записей списка в одну единую комбинированную запись.

Я рекомендую использовать сериализатор Jsom, который позволяет вам определить, какиеатрибуты / функции должны быть проанализированы.Затем реализуйте функцию, которая возвращает список словарей, который объединяет записи списка в соответствующие объединенные.Затем позвольте сериализатору сериализовать выходные данные этой функции, и все готово.

Вы можете использовать этот класс для этого: Json.NET JSONConvertor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...