Modules
Concept Objects { } hold key–value pairs; arrays [ ] hold lists. Values: string, number, true/false, null, object, array. Keys use double quotes.
Where it's used Reading the sample file the client provides.
{
"crmId": "CRM98765",
"firstName": "Mario",
"isMember": true,
"orders": [101, 102]
}Practice: Write a JSON object for yourself with 5 fields including one array.
Screenshot Your JSON object in an editorAdd screenshots/json/module-01.png
Concept Common errors: trailing commas, single quotes, unquoted keys, mixed types for the same field, inconsistent date formats.
Where it's used Step 1 of any AEP build: “Is the JSON in a good structure?”
Bad: {'crmId': "CRM1", "age": "41",}
Good: {"crmId": "CRM1", "age": 41}Practice: Paste the client sample into a JSON validator (e.g. VS Code) and fix every error.
Screenshot Validator showing the file is validAdd screenshots/json/module-02.png
Concept Objects can nest. A path like customer.address.city or items[0].sku points to one value.
Where it's used Mapping deep source fields to XDM fields during source setup.
{
"customer": {
"address": { "city": "Phoenix" }
},
"items": [ { "sku": "A1" } ]
}
→ customer.address.city, items[0].skuPractice: Write the path to every leaf value in the example.
Screenshot Your path listAdd screenshots/json/module-03.png
Concept Each client field gets a home in the schema: standard field groups first, custom fields under _tenantId.
Where it's used The mapping step in AEP Sources (source → target).
"crmId" → _tenantId.crmId
"firstName" → person.name.firstName
"lastName" → person.name.lastName
"primaryEmail" → personalEmail.addressPractice: Build a mapping table for the full client sample file.
Screenshot Your mapping table / AEP mapping screenAdd screenshots/json/module-04.png
Concept Events need _id, timestamp and eventType; identityMap holds identities by namespace.
Where it's used What the Web SDK sends to the Edge Network for each event.
{
"_id": "evt-001",
"timestamp": "2026-10-21T10:00:00Z",
"eventType": "commerce.productViews",
"identityMap": {
"ECID": [{"id": "123…", "primary": true}]
}
}Practice: Write an event payload for “add to cart” with a product SKU.
Screenshot Your payload validated against the schemaAdd screenshots/json/module-05.png
Concept A JSON Schema describes allowed fields: type, properties, required. XDM schemas are JSON Schemas.
Where it's used Reading a schema export or Schema Registry API response.
{
"type": "object",
"properties": {
"crmId": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["crmId"]
}Practice: Write a schema for the client sample with crmId required.
Screenshot Your schema fileAdd screenshots/json/module-06.png
Concept API calls send/receive JSON with headers: Authorization (Bearer token), x-api-key, x-gw-ims-org-id, x-sandbox-name.
Where it's used Automating schema/dataset work via Postman and Adobe Developer Console.
GET /data/foundation/schemaregistry/tenant/schemas
Headers:
Authorization: Bearer {token}
x-api-key: {client_id}
x-gw-ims-org-id: {org_id}
x-sandbox-name: dev
Accept: application/vnd.adobe.xed-id+jsonPractice: List your sandbox’s schemas through the API in Postman.
Screenshot Postman response listing schemasAdd screenshots/json/module-07.png
Concept Format, validate and query JSON with VS Code, browser dev tools and jq.
Where it's used Quick checks on large exports and API responses.
jq '.[] | {crmId, primaryEmail}' customers.json
jq 'map(select(.primaryEmail == null)) | length' customers.jsonPractice: Use jq to count records with no email in the sample file.
Screenshot Terminal output from jqAdd screenshots/json/module-08.png