There are several ways of going about this in the email. The payload in the API call is the easy part.
For example if you have the following JSON passed in an attribute named JSON
in your API call:
[{
"sku": "123",
"name": "Square",
"url": "https://spmvs.com?sku=123"
}, {
"sku": "456",
"name": "Circle",
"url": "https://spmvs.com/?sku=456"
}, {
"sku": "789",
"name": "Triangle",
"url": "https://spmvs.com/?sku=789"
}]
You can parse it with either GTL or SSJS in the email:
<html>
<head>
<style>
body, a, input {font-family:sans-serif;}
</style>
</head>
<body style="font-family:sans-serif">
%%=now()=%%
<h1>JSON Parse with GTL</h1>
%%[
var @json
set @json = AttributeValue("json")
if not empty(@json) then
]%%
{{.dataobject JsonVar type=variable source=@json maxrows=20}}
{{.data}}
{"target":"@json"}
{{/data}}
{{/dataobject}}
{{#each JsonVar}}
<br><a href="%%=RedirectTo(TreatAsContent('{{url}}'))=%%">{{sku}}</a> - <a href="%%=RedirectTo(TreatAsContent('{{url}}'))=%%">{{name}}</a>
{{/each}}
%%[
else
outputline(concat("<br>no JSON found"))
endif
]%%
<h1>JSON Parse with SSJS</h1>
<script runat="server">
Platform.Load("Core","1.1.1");
var json = Attribute.GetValue('json');
var jsonObj = Platform.Function.ParseJSON(json);
if (jsonObj.length > 0) {
for (var i = 0; i < jsonObj.length; i++ ) {
var item = jsonObj[i];
Platform.Variable.SetValue("@sku",item['sku']);
Platform.Variable.SetValue("@name",item['name']);
Platform.Variable.SetValue("@url",item['url']);
</script>
<br><a href="%%=redirectto(@url)=%%">%%=v(@sku)=%%</a> - <a href="%%=redirectto(@url)=%%">%%=v(@name)=%%</a>
<script runat="server">
}
} else {
Write("no products found")
}
</script>
<br><br><br><a href="%%profile_center_url%%">Profile/Preference Center</a>
<br><a href="%%subscription_center_url%%">Subscription Center</a>
<br><a href="%%unsub_center_url%%">One-Click Unsubscribe</a>
<p>This email was sent by:
<b>%%Member_Busname%%</b>
<br>%%Member_Addr%%, %%Member_City%%, %%Member_State%% %%Member_PostalCode%% %%Member_Country%%</p>
<custom name="opencounter" type="tracking">
</body>
</html>
There some more details here in this presentation: AMPScript Uncovered