Как создать объект json из набора элементов

В Фабрике данных Azure у меня есть конвейер (состоящий из потоков, но это технический аспект), который более или менее представляет собой следующий поток:

  1. Получите набор элементов из набора данных (скажем: я получаю 5 автомобилей, у каждого автомобиля есть свои «столбцы» — идентификатор, цвет, модель,...)

  2. превратить этот набор в массив: я делаю это с блоком Aggregate, который содержит функцию сценария «собрать».

Что я хочу :

Я хотел бы, чтобы на шаге 2 был создан объект, а не массив.

Если бы это был json, я бы хотел:

//NOT THIS
[
 { "id":"1", "model":"", "color":"red" }, 
 { "id":"2", "model":"", "color":"blue" }, 
]


//THIS
{
 "1": { "model":"", "color":"red" }, 
 "2": { "model":"", "color":"blue" }, 
}

Я пытался работать с объектами как со строками, а затем использовать кучу «заменить», чтобы превратить [ ] в { } ... но это слишком много усилий - и, что более важно, слишком высок риск того, что я совершу ошибку с побегом персонажа.

Как бы вы превратили набор элементов в один объект вместо массива?

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

Мне нужно проверить, но я думаю, что решение может быть связано с функцией «уменьшить»: kromerbigdata.com/2021/01/06/…

jeancallisti 04.04.2023 15:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Фабрика данных работает со схемами. Каждый столбец строго типизирован.

Например, если представить, что я начал с набора данных на основе файла json:

[
 { "id":"1", "model":"", "color":"red" }, 
 { "id":"2", "model":"", "color":"blue" }, 
]

Затем эти значения немедленно именуются и преобразуются в известные типы данных: есть столбец с именем «id», другой столбец с именем «модель» и третий столбец с именем «цвет». У них есть имена. Есть шаблон. В каждом ряду одинаковый узор.

Единственное, что может не иметь имени, — это массив: потому что мы знаем, что это набор элементов, имеющих одинаковую схему (т. е. имена столбцов).

Но если вы превратите его в словарь, вы нарушите шаблон: теперь у вас есть объект, поля (столбцы) которого имеют непредсказуемые имена.

{
 "1": { "model":"", "color":"red" }, 
 "2": { "model":"", "color":"blue" }, 
}

например, в словаре чуть выше теперь есть поле (столбец) с именем "1", еще одно с именем "2", еще одно с именем "3"... Для этого объекта нет шаблона. Мы не знаем, сколько полей он может иметь. Помните: это не массив. Это должно быть объектом. Вы должны знать, сколько полей имеет объект, если планируете его вводить. Было бы еще хуже, если бы идентификаторы были гидами. Полностью зашифрованные, непредсказуемые имена полей/столбцов.

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

=================

При этом вы все равно можете создать словарь в виде строки, которую вы, возможно, захотите проанализировать позже, за пределами фабрики данных (например, в C#, в вашем бэкэнде, который реагирует на вставки в набор данных приемника).

Тогда вот как вы это получите:

  1. Создайте фиктивный столбец для хранения новой так называемой строки json. Для этого используйте обычную технику фабрики данных: создайте блок «производный столбец» в своем потоке, дайте имя новому столбцу (например, «asStringDictionary»), затем нажмите «Построитель выражений» прямо под полем «Выражение». вашей фиктивной колонки.

  1. В построителе выражений используйте такое выражение. По сути, используйте шаблон «редуктор»:

    уменьшать( элементы массива,
    "", #acc + toString(#item) + ",", concat(символ(123), #результат,символ(125)) )

Конечно, замените «arrayItems» именем вашего собственного набора элементов, который вы получили из блока потока непосредственно перед только что добавленным производным блоком столбца.

Обратите внимание, что в моем случае в предыдущем кирпиче уже было выполнено следующее преобразование:

from
{ "id" : "1", ... ALL OTHER FIELDS ... }
to
{  "1": { ... ALL OTHER FIELDS ... }  }

Я сделал это в еще одном производном столбце, на этот раз с таким выражением:

associate(id, @())
Ответ принят как подходящий

Другой ответ говорит, что вопрос бессмысленный. Но это не совсем так.

Если ваша цель действительно состоит в том, чтобы создать словарь, то есть вы действительно хотите иметь один столбец для каждого идентификатора, т. е. один выходной столбец для каждой входной строки, вы можете исследовать следующее поле фабрики данных Azure: «строки в столбцы», также известное как вращаться. например: Строки в столбцы в ADF

Обратите особое внимание на пояснения к пункту «Разрешить дрейф схемы», чтобы управлять развитием схемы по мере преобразования столбцов.

Примечание: конечно, вы хотите быть уверены, что будет достаточно небольшое количество входных идентификаторов — вы не хотите создавать один гигантский словарь. Я не знаю, как ADF отреагирует на это с точки зрения производительности.

Примечание. В этом ответе я обсуждаю только преобразование идентификаторов, но, конечно, все еще остается вопрос о превращении других полей/столбцов в объект словаря, предназначенный для соответствия ключу. Это будет сделано так же, как и в другом ответе (посмотрите на часть, касающуюся «ВСЕХ ДРУГИХ ПОЛЕЙ»).

Другие вопросы по теме