{{ transformations:ConstructJsonAction.png}}
======CONSTRUCT JSON======
Category: Transform / Web\\
\\
=====Description=====
This action constructs a [[https://en.wikipedia.org/wiki/JSON|JSON]] object from a tabular dataset. It has two modes: Object per row, array from objects; and Array per column. A constructed JSON object is effectively a regular text value that is stored in a datagrid cell in EasyMorph.\\
\\
=====Action settings=====
^ Mode ^ Description ^
|Object per row, array from objects|Each row of the source dataset is used to construct a flat JSON object in which every column value corresponds to one object property. See Example #1, below.\\ \\ If the source dataset contains multiple rows, they will be converted into an array of JSON objects where each object corresponds to one row. See Example #2, below.|
|Array per column|The source dataset is converted into a new dataset in which values of each column are rolled up into a JSON array. See Example #3, below.|
\\
===="Object per row, array from objects" settings====
^ Setting ^ Description ^
|Column name|Enter the name of the column that will contain the constructed JSON.|
|Make an array even for single object|When checked, the result is always a JSON array, even if the source dataset (or a group) has only one row. When unchecked, a single row produces a single JSON object. See Example #4, below.|
|Group by selected columns|When checked, select the column(s) to group by. The result contains one row per group: the group column(s), followed by the JSON column constructed from the rows of that group. The group columns are not included in the JSON objects. See Example #6, below.|
\\
===="Array per column" settings====
^ Setting ^ Description ^
|Exclude nulls from arrays|When checked, empty values are left out of the arrays. When unchecked, they are included as //null//. See Example #5, below.|
|Group by selected columns|When checked, select the column(s) to group by. The result contains one row per group: the group column(s), followed by one column per remaining column, each containing a JSON array of that column's values in the group. See Example #7, below.|
\\
=====Remarks=====
====Data type conversion====
EasyMorph data types are converted to JSON types as follows:
^ EasyMorph ^ Example ^ JSON ^ Example ^
| Text | ABC | string | "ABC" |
| Number | 123.45 | number | 123.45 |
| Number (formatted as date) | 2020-Jan-10 | date | 2020-01-10T00:00:00 |
| Boolean | TRUE | boolean | true |
| Empty | | null | null |
| Error | #Division by zero | Fails to convert ||
Note that the action fails if the source dataset contains an error value.
\\
====Nesting JSON objects====
EasyMorph automatically detects if a text value is already a JSON object or a JSON array. In this case, the text value is inserted verbatim, i.e. **without** wrapping in double-quotes. This feature allows creating complex hierarchical JSON objects that nest other JSON objects. For instance, converting the table below:
^ Track ^ Country ^ State/province ^ City ^ Location ^ Hiatus ^
| Circuit Gilles Villeneuve | Canada | QC | Montreal | {"lat":45.500578, "long":-73.522461} | [1987, 2009] |
would produce the following JSON:
{
"Track":"Circuit Gilles Villeneuve",
"Country":"Canada",
"State/province":"QC",
"City":"Montreal",
"Location": {
"lat":45.500578,
"long":-73.522461
},
"Hiatus": [1987, 2009]
}
Notice that "Location" is inserted as a JSON object, not as text. Also, the field "Hiatus" is inserted as a JSON array, not as text.
\\
=====Examples=====
====Example #1====
>Construct a flat JSON object from the tabular dataset.
===Before (source table)===
^ Name ^ Kingdom ^ Phylum ^ Class ^
| Rabbit |Animalia | Chordata | Mammalia |
===After (result table)===
{
"Name":"Rabbit",
"Kingdom":"Animalia",
"Phylum":"Chordata",
"Class": "Mammalia",
}
===Action parameters===
>Mode: Object per row
\\
====Example #2====
>Create flat JSON objects (inside an array) from the multi-row tabular dataset.
===Before (source table)===
^ ID ^ Name ^
| 1 | Apple |
| 2 | Orange |
===After (result table)===
[
{
"ID":1,
"Name":"Apple"
},
{
"ID":2,
"Name":"Orange"
}
]
===Action parameters===
>Mode: Object per row
\\
====Example #3====
>Convert the source table into a dataset in which values of each column are rolled up into a JSON array.
===Before (source table)===
^ ID ^ Name ^
| 1 | Apple |
| 2 | Orange |
===After (result table)===
^ ID ^ Name ^
| [1,2] | ["Apple","Orange"] |
===Action parameters===
>Mode: Array per column
\\
====Example #4====
>Always return an array, even when the table has only one row (useful for APIs that expect an array). Without this option, the result would be a single object: {"ID":1,"Name":"Apple"}
===Before (source table)===
^ ID ^ Name ^
| 1 | Apple |
===After (result table)===
[
{
"ID":1,
"Name":"Apple"
}
]
===Action parameters===
>Mode: Object per row, array from objects
>Make an array even for single object: checked
\\
====Example #5====
>Leave empty values out of the arrays. Without this option, the "Discount" column would contain [10,null,5].
===Before (source table)===
^ ID ^ Name ^ Discount ^
| 1 | Apple | 10 |
| 2 | Orange | |
| 3 | Banana | 5 |
===After (result table)===
^ ID ^ Name ^ Discount ^
| [1,2,3] | ["Apple","Orange","Banana"] | [10,5] |
===Action parameters===
>Mode: Array per column
>Exclude nulls from arrays: checked
\\
====Example #6====
>Construct one JSON per customer. Bob has only one row, so his value is a single object. Check "Make an array even for single object" to get [{"Product":"Banana","Qty":2}] instead.
===Before (source table)===
^ Customer ^ Product ^ Qty ^
| Alice | Apple | 3 |
| Alice | Orange | 1 |
| Bob | Banana | 2 |
===After (result table)===
Alice:
[
{
"Product":"Apple",
"Qty":3
},
{
"Product":"Orange",
"Qty":1
}
]
Bob:
{
"Product":"Banana",
"Qty":2
}
===Action parameters===
>Mode: Object per row, array from objects
>Group by selected columns: Customer
\\
====Example #7====
>Roll up the values of each column into arrays per customer. In this mode, an array is created even for a group with a single row.
===Before (source table)===
^ Customer ^ Product ^ Qty ^
| Alice | Apple | 3 |
| Alice | Orange | 1 |
| Bob | Banana | 2 |
===After (result table)===
^ Customer ^ Product ^ Qty ^
| Alice | ["Apple","Orange"] | [3,1] |
| Bob | ["Banana"] | [2] |
===Action parameters===
>Mode: Array per column
>Group by selected columns: Customer
\\
=====Community examples=====
* [[https://community.easymorph.com/t//1279/6|Example: Constructing JSON]] ([[https://community.easymorph.com/uploads/short-url/qlhc3zdusCyuxWf2u0h0dqvgo0v.morph|Project]]; Module: //Main//; Group: //Tab 1//; Table: //comments//; Action position: //2//)
* [[https://community.easymorph.com/t//1661/1|How to create JSON for Airtable API]] ([[https://community.easymorph.com/uploads/short-url/kBrGoLczmNrnMt0SnXUhqOwjjRF.morph|Project]]; Module: //Main//; Group: //Tab 1//; Table: //Table 1//; Action position: //6//)
* [[https://community.easymorph.com/t//2142/2|Constructing JSON issue]] ([[https://community.easymorph.com/uploads/short-url/aSWREiaUoC1qFEYRqTyu4Nwzdls.morph|Project]]; Module: //Main//; Group: //Tab 1//; Table: //Construct main JSON//; Action position: //4//)
* [[https://community.easymorph.com/t//2641/1|How to publish real-time data to streaming dataset in Power BI]] ([[https://community.easymorph.com/uploads/short-url/22DTxfF295TVGQhGyvWGsHyadRt.morph|Project]]; Module: //Main//; Group: //Tab 1//; Table: //Table 1//; Action position: //5//)
* [[https://community.easymorph.com/t/webrequest-and-parameters/2758/3|Community example: Webrequest and parameters]]
\\
===== See also =====
* [[transformations:parsejson|Parse JSON]]
* [[syntax:functions:isjson|Functions: IsJson()]]