Мне нужно получить источник данных APEX Rest для анализа моего JSON, который имеет вложенный массив. Я читал, что вложенные массивы JSON не поддерживаются, но должен быть способ.
У меня есть REST API, который возвращает данные через JSON, как показано ниже. В Apex я создал источник данных REST, следуя руководству в этом блоге Oracle ссылка
Однако функция автоматического обнаружения не «обнаруживает» вложенный массив. Он возвращает только данные корневого уровня.
[ {
"order_number": "so1223",
"order_date": "2022-07-01",
"full_name": "Carny Coulter",
"email": "[email protected]",
"credit_card": "3545556133694494",
"city": "Myhiya",
"state": "CA",
"zip_code": "12345",
"lines": [
{
"product": "Beans - Fava, Canned",
"quantity": 1,
"price": 1.99
},
{
"product": "Edible Flower - Mixed",
"quantity": 1,
"price": 1.50
}
]
},
{
"order_number": "so2244",
"order_date": "2022-12-28",
"full_name": "Liam Shawcross",
"email": "[email protected]",
"credit_card": "6331104669953298",
"city": "Humaitá",
"state": "NY",
"zip_code": "98670",
"lines": [
{
"order_id": 5,
"product": "Beans - Green",
"quantity": 2,
"price": 4.33
},
{
"order_id": 1,
"product": "Grapefruit - Pink",
"quantity": 5,
"price": 5.00
}
]
},
]
Таким образом, в приведенном выше JSON он «обнаруживает» только order_numbers до zip_code. Массив «lines» с атрибутами «order_id», «product», «quantity» и «price» не «обнаруживается».
Я нашел этот ТАКОЙ вопрос, в котором Карстен инструктирует создать источник данных Rest вручную. Я попытался изменить селектор строк на "." (точка) и оставить его пустым. Это по-прежнему возвращает данные корневого уровня.
Изменение селектора строк на «линии» возвращает только 1 массив для каждой «линии».
Таким образом, в приведенном выше примере JSON он только «обнаружит»:
{
"product": "Beans - Fava, Canned",
"quantity": 1,
"price": 1.99
}
{
"order_id": 5,
"product": "Beans - Green",
"quantity": 2,
"price": 4.33
}
а не весь массив..
Вот как настраивается профиль данных при создании источника данных вручную.
Есть еще один вопрос SO с похожей ситуацией, поэтому я выполнил некоторые шаги, такие как выбор типа данных для «линий» в качестве документа JSON. Я чувствую, что пробовал почти все селекторы и типы данных. Но явно недостаточно.
Документы не очень полезны по этому вопросу, и было трудно найти ссылки в Google, блогах Oracle или SO.
Моя конечная цель состояла бы в том, чтобы две таблицы, как показано ниже, автоматически синхронизировались с API.
orders
id pk
order_number num
order_date date
full_name vc(200)
email vc(200)
credit_card num
city vc(200)
state vc(200)
zip_code num
lines
order_id /fk orders
product vc(200)
quantity num
price num
view orders_view orders lines
Как вы правильно заметили, источники данных REST не поддерживают вложенные массивы - источник REST может «извлекать» только одну плоскую таблицу из ответа JSON. В вашем примере JSON как таковой представляет собой массив («заказы»). Таким образом, селектор строк в профиле данных будет «.
» (для выбора «корневого узла»).
Это дает вам все атрибуты порядка, но обнаружение пропустит массив lines
. Однако вы можете вручную добавить в профиль данных столбец с типом данных JSON Document и использовать строки в качестве селектора.
В результате вы все равно получите плоскую таблицу из источника данных REST, но эта таблица содержит столбец LINES
, который содержит «фрагмент JSON» для элементов строки заказа. Затем вы можете синхронизировать источник REST с локальной таблицей («Синхронизация REST»), а затем использовать некоторый пользовательский код для извлечения фрагментов JSON в дочернюю таблицу ORDER_LINES
.
Это помогает?
Эй, Карстен, ты легенда. Ваши инструкции сработали именно так, как я хотел. Спасибо. Продолжил свой вопрос в другой теме. stackoverflow.com/questions/75192510/… Пожалуйста, посмотрите и посоветуйте. Ваша поддержка очень ценится .. не только мной .. Ура!