Постройте полезный груз JSON

У меня есть следующая таблица:

Table

Я хотел бы выполнить Вопрос LINQ, который преобразовывает в последовательную форму:

JSON:

{
  "product-list": {
    "products": [
        {
          "P_Flavor": [
            "Berry",
            "Cedar",
            "Cherry",
            "Coffee"
          ],
          "P_Winery": [
            "Lyeth"
          ],
          "P_Body": [
            "Elegant",
            "Firm",
            "Firm Tannins",
            "Polished",
            "Supple",
            "Tannins"
          ],
          "P_Name": "A Red Blend",
          "P_DateReviewed": "08/31/95",
          "P_WineID": 34699,
          "P_Score": 5,
        }
    ]
  }
}

Я обычно использовал бы JavaScriptSerializer , чтобы сделать это, однако я хотел бы построить свой собственный полезный груз JSON.

IList recList = (from c in entities.record_property
                                    select c).ToList();

var json = new JavaScriptSerializer().Serialize(recList);

Каков был бы лучший способ сделать это?

0
nl ja de
You' ре говоря вас не хочет использовать какой-либо.NET последовательно-параллельньный преобразователь, и вместо этого строить последовательность JSON вручную?
добавлено автор Mike Christensen, источник
Да, и I' d нравится создавать отличные множества каждой стоимости на основе propkey , если это имеет смысл.
добавлено автор fuzz, источник
Тогда бросьте взгляд на Система. Текст. StringBuilder
добавлено автор Sam Axe, источник

1 ответы

Может быть более быстрый/больше краткий способ сделать это, но я сделал это, объединившись a JavaScriptConverter с типом помощника.

Конвертер (более простой, чем он выглядит, вдохновленным здесь):

private class RecordPropertyJavaScriptConverter : JavaScriptConverter
{
    private static readonly Type[] _supportedTypes = new[]
    {
        typeof(record_group)
    };

    public override IEnumerable SupportedTypes
    {
        get { return _supportedTypes; }
    }

    public override object Deserialize(IDictionary dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (type == typeof(record_group))
        {
            record_group obj = new record_group();

            var kvp = dictionary.Single();

            obj.Key = kvp.Key;
            obj.Values = serializer.ConvertToType>(kvp.Value);

            return obj;
        }

        return null;
    }

    public override IDictionary Serialize(object obj, JavaScriptSerializer serializer)
    {
        var dataObj = obj as record_group;
        if (dataObj != null)
        {
            return new Dictionary
            {
                {dataObj.Key,  dataObj.Values}
            };
        }
        return new Dictionary();
    }
}

Тип помощника:

private class record_group
{
    public string Key;
    public IEnumerable Values;
}

Кодекс преобразования в последовательную форму:

var groups = recList.GroupBy(r => r.Key)
                    .Select(g => new record_group { Key = g.Key, Values = g.Select(r => r.Value) });

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new [] {new RecordPropertyJavaScriptConverter()});
string json = serializer.Serialize(groups);

Продукция (с некоторыми счетами, новые строки, добавленные мной):

[{"P_Flavor":["Berry","Cedar","Cherry","Coffee"]},
 {"P_Winery":["Lyeth"]},
 {"P_Body":["Elegant","Firm","Firm Tannins","Polished","Supple","Tannins"]},
 {"P_Name":["A Red Blend"]},
 {"P_DateReviewed":["08/31/95"]},
 {"P_WineID":[34699]},
 {"P_Score":[5]}]

Десериализация может тогда быть сделана (использование того же самого случая последовательно-параллельньного преобразователя сверху) следующим образом:

var deserialized = serializer.Deserialize>(json);
var properties = deserialized.SelectMany(g => g.Values.Select(v => new record_property { Key = g.Key, Value = v }));
1
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

All That JS
All That JS
417 участник(ов)

JS на русском

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)