Skip to content

Instantly share code, notes, and snippets.

@4sskick
Last active May 21, 2025 08:10
Show Gist options
  • Save 4sskick/4c7368da1349bdde16ea7c11b1d90d7a to your computer and use it in GitHub Desktop.
Save 4sskick/4c7368da1349bdde16ea7c11b1d90d7a to your computer and use it in GitHub Desktop.
parse dynamic URL encoded key value
let's say got string encoded URL like this
'pData%5B0%5D%5Bvalue%5D=&pData%5B0%5D%5Bname%5D=MultiAllowanceDetailOriginalEmployeeMultiAllowanceRecordList&pData%5B1%5D%5Bvalue%5D=MultiAllowanceDetail&pData%5B1%5D%5Bname%5D=MultiAllowanceDetailItemCode&pData%5B2%5D%5Bvalue%5D=true&pData%5B2%5D%5Bname%5D=MultiAllowanceDetailHasMultipleRecord&pData%5B3%5D%5Bvalue%5D=00000000-0000-0000-0000-000000000000&pData%5B3%5D%5Bname%5D=MultiAllowanceDetailRecordID&pData%5B4%5D%5Bvalue%5D=787b382e-bf20-f011-bad0-06d40d699a17&pData%5B4%5D%5Bname%5D=MultiAllowanceDetailParentRecordID&pData%5B5%5D%5Bvalue%5D=A&pData%5B5%5D%5Bname%5D=MultiAllowanceDetailDataChangeType&pData%5B6%5D%5Bvalue%5D=%7B%22OriginalEmployeeMultiAllowanceRecordList%22%3A%5B%7B%22RecordID%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22TargetRecordID%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22ParentRecordID%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22AllowanceCode%22%3A%22%23AR_BASC%22%2C%22DateStart%22%3A%222018-02-23T00%3A00%3A00%22%2C%22DateEnd%22%3A%220001-01-01T00%3A00%3A00%22%2C%22Quantity%22%3A12345%2C%22CurrencyCode%22%3A%22%22%2C%22RunType%22%3A%22M%22%2C%22PayRunBatch%22%3A%22%22%2C%22DetailRemarks%22%3A%22%22%2C%22DataChangeType%22%3Anull%2C%22EmployeeCode%22%3A%22TH012%22%2C%22PSMultiAllowanceRecordID%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22PSMultiAllowanceRecordIDOriginal%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22EmployeeCodeOriginal%22%3A%22TH012%22%2C%22TargetRecordIDOriginal%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22ParentRecordIDOriginal%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22AllowanceCodeOriginal%22%3A%22%23AR_BASC%22%2C%22DateStartOriginal%22%3A%222018-02-23T00%3A00%3A00%22%2C%22DateEndOriginal%22%3A%220001-01-01T00%3A00%3A00%22%2C%22QuantityOriginal%22%3A12345%2C%22CurrencyCodeOriginal%22%3A%22%22%2C%22RunTypeOriginal%22%3A%22M%22%2C%22PayRunBatchOriginal%22%3A%22%22%2C%22DetailRemarksOriginal%22%3A%22%22%2C%22Old%22%3Anull%2C%22AdditionalMessages%22%3Anull%7D%5D%2C%22ItemCode%22%3A%22MultiAllowanceDetail%22%2C%22HasMultipleRecord%22%3Atrue%2C%22RecordID%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22ParentRecordID%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22DataChangeType%22%3A%22A%22%2C%22OriginalValues%22%3Anull%2C%22TargetRecordID%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22IsHasDataChange%22%3Afalse%2C%22EmployeeCode%22%3A%22TH012%22%2C%22SubmitRole%22%3A%22%22%2C%22ScreenName%22%3A%22MultiAllowanceDetail%22%2C%22IsSingle%22%3Afalse%2C%22IsHR%22%3Afalse%2C%22CanAddNew%22%3Atrue%2C%22DateStart%22%3A%220001-01-01T00%3A00%3A00%22%2C%22DateStartUI%22%3A%220001-01-01T00%3A00%3A00%22%2C%22AttachmentID%22%3Anull%2C%22SubmitterRequest%22%3Anull%2C%22SkillCodeUI%22%3Anull%2C%22SkillCode%22%3Anull%2C%22MultiDetailRecord%22%3Anull%2C%22PSCAccess%22%3A%7B%22RetrieveLatestData%22%3Afalse%2C%22RequireApproval%22%3Anull%2C%22ScreenName%22%3A%22MultiAllowanceDetail%22%2C%22ScreenAccess%22%3A%22*%22%2C%22SubmissionMessage%22%3A%22%22%2C%22RequireAcknowledgement%22%3A%22%22%2C%22Sequence%22%3A3%2C%22Enabled%22%3Atrue%2C%22RestrictModify%22%3Afalse%2C%22AllowAttachment%22%3A%22%22%2C%22AttachmentRequiredCountryCodes%22%3A%22%22%2C%22AttachmentOptionalCountryCodes%22%3A%22%22%2C%22RestrictDelete%22%3Afalse%2C%22AttachmentAccess%22%3A%22%22%2C%22LatestDetail%22%3Afalse%2C%22CountryCodes%22%3A%22%22%2C%22TagField%22%3A%22%22%2C%22Caption%22%3Anull%2C%22HasWritableField%22%3Afalse%2C%22HasReadableField%22%3Afalse%2C%22Name%22%3Anull%2C%22AllowAttachmentRequired%22%3Anull%2C%22AllowAttachmentOptional%22%3Anull%2C%22AllowAttachmentNotAvailable%22%3Anull%2C%22DisplayScreenName%22%3A%22MultiAllowanceDetail%22%2C%22Old%22%3Anull%2C%22AdditionalMessages%22%3Anull%7D%2C%22TargetTableName%22%3A%22TblRecurring%22%2C%22KeyFields%22%3A%5B%5D%2C%22SelectionName%22%3A%22PSMultiAllowanceDetail%22%2C%22Old%22%3Anull%2C%22AdditionalMessages%22%3Anull%7D&pData%5B6%5D%5Bname%5D=MultiAllowanceDetailOriginalValues&pData%5B7%5D%5Bvalue%5D=00000000-0000-0000-0000-000000000000&pData%5B7%5D%5Bname%5D=MultiAllowanceDetailTargetRecordID&pData%5B8%5D%5Bvalue%5D=false&pData%5B8%5D%5Bname%5D=MultiAllowanceDetailIsHasDataChange&pData%5B9%5D%5Bvalue%5D=TH012&pData%5B9%5D%5Bname%5D=MultiAllowanceDetailEmployeeCode&pData%5B10%5D%5Bvalue%5D=%25&pData%5B10%5D%5Bname%5D=MultiAllowanceDetailSubmitRole&pData%5B11%5D%5Bvalue%5D=MultiAllowanceDetail&pData%5B11%5D%5Bname%5D=MultiAllowanceDetailScreenName&pData%5B12%5D%5Bvalue%5D=false&pData%5B12%5D%5Bname%5D=MultiAllowanceDetailIsSingle&pData%5B13%5D%5Bvalue%5D=false&pData%5B13%5D%5Bname%5D=MultiAllowanceDetailIsHR&pData%5B14%5D%5Bvalue%5D=true&pData%5B14%5D%5Bname%5D=MultiAllowanceDetailCanAddNew&pData%5B15%5D%5Bvalue%5D=0001-01-01T00%3A00%3A00&pData%5B15%5D%5Bname%5D=MultiAllowanceDetailDateStart&pData%5B16%5D%5Bvalue%5D=0001-01-01T00%3A00%3A00&pData%5B16%5D%5Bname%5D=MultiAllowanceDetailDateStartUI&pData%5B17%5D%5Bvalue%5D=&pData%5B17%5D%5Bname%5D=MultiAllowanceDetailAttachmentID&pData%5B18%5D%5Bvalue%5D=&pData%5B18%5D%5Bname%5D=MultiAllowanceDetailSubmitterRequest&pData%5B19%5D%5Bvalue%5D=&pData%5B19%5D%5Bname%5D=MultiAllowanceDetailSkillCodeUI&pData%5B20%5D%5Bvalue%5D=&pData%5B20%5D%5Bname%5D=MultiAllowanceDetailSkillCode&pData%5B21%5D%5Bvalue%5D=%5Bobject+Object%5D&pData%5B21%5D%5Bname%5D=MultiAllowanceDetailMultiDetailRecord&pData%5B22%5D%5Bvalue%5D=TblRecurring&pData%5B22%5D%5Bname%5D=MultiAllowanceDetailTargetTableName&pData%5B23%5D%5Bvalue%5D=&pData%5B23%5D%5Bname%5D=MultiAllowanceDetailKeyFields&pData%5B24%5D%5Bvalue%5D=PSMultiAllowanceDetail&pData%5B24%5D%5Bname%5D=MultiAllowanceDetailSelectionName&pData%5B25%5D%5Bvalue%5D=&pData%5B25%5D%5Bname%5D=MultiAllowanceDetailOld&pData%5B26%5D%5Bvalue%5D=&pData%5B26%5D%5Bname%5D=MultiAllowanceDetailAdditionalMessages&pData%5B27%5D%5Bvalue%5D=787b382e-bf20-f011-bad0-06d40d699a17&pData%5B27%5D%5Bname%5D=RecordID&pData%5B28%5D%5Bvalue%5D=9d89fc50-861b-4cac-a6c5-be37344cd19b&pData%5B28%5D%5Bname%5D=RequestID&pData%5B29%5D%5Bvalue%5D=00000000-0000-0000-0000-000000000000&pData%5B29%5D%5Bname%5D=PreviousRecordID&pData%5B30%5D%5Bvalue%5D=TH012&pData%5B30%5D%5Bname%5D=EmployeeCode&pData%5B31%5D%5Bvalue%5D=%25&pData%5B31%5D%5Bname%5D=SubmitRole&pData%5B32%5D%5Bvalue%5D=&pData%5B32%5D%5Bname%5D=QuestCode&pData%5B33%5D%5Bvalue%5D=&pData%5B33%5D%5Bname%5D=WorkflowSessionKey&pData%5B34%5D%5Bvalue%5D=&pData%5B34%5D%5Bname%5D=MultiManagerDetailOriginalValues&pData%5B35%5D%5Bvalue%5D=&pData%5B35%5D%5Bname%5D=MultiManagerDetailRecordID&pData%5B36%5D%5Bvalue%5D=*&pData%5B36%5D%5Bname%5D=StatusChangeReasonCodes&pData%5B37%5D%5Bvalue%5D=&pData%5B37%5D%5Bname%5D=Justification&pData%5B38%5D%5Bvalue%5D=&pData%5B38%5D%5Bname%5D=NextApproverEC&pData%5B39%5D%5Bname%5D=QuestFormData&pScreenChange=%5B%22MultiAllowanceDetail%22%2C%22MultiAllowanceDetail%22%5D&pEmployeeCode=TH012&pRole=%25&pWorkflowAction=Approve&pRecordID=787b382e-bf20-f011-bad0-06d40d699a17&pReasonCode=&pRequestID=9d89fc50-861b-4cac-a6c5-be37344cd19b&pIsHR=false&pFormData=&pNextApprover='
decode it to make it able parsed as JSON
type DecodedValue = string | number | boolean | object | null | undefined;
type DecodedObject = {
[key: string]: DecodedValue | DecodedValue[] | DecodedObject;
};
function parseUrlEncodedData(encodedString: string): DecodedObject {
const decoded = decodeURIComponent(encodedString);
const params = new URLSearchParams(decoded);
const result: DecodedObject = {};
const parseValue = (value: string): DecodedValue => {
if (value === '') return '';
if (value === 'null') return null;
if (value === 'undefined') return undefined;
if (value === 'true') return true;
if (value === 'false') return false;
// check is number
if (!isNaN(Number(value)) && value.trim() === '') return Number(value);
try {
return JSON.parse(value);
} catch {
return value;
}
};
params.forEach((value, key) => {
let current: any = result;
const parsedValue = parseValue(value);
const keys = key.split(/[\[\]]/).filter((k) => k !== '');
keys.forEach((k, i) => {
// last key - set value
if (i === keys.length - 1) {
// handle array indices
if (!isNaN(Number(k))) {
if (!Array.isArray(current)) {
current = [];
}
current[Number(k)] = parsedValue;
} else {
current[k] = parsedValue;
}
}
// not last key - navigate the structure
else {
const nextKey = keys[i + 1];
const isNextKeyNumeric = !isNaN(Number(nextKey));
// init next key level if needed
if (!current[k]) {
current[k] = isNextKeyNumeric ? [] : {};
}
// to next level
current = current[k];
}
});
});
return result;
}
let encodedData =
'pData%5B0%5D%5Bvalue%5D=&pData%5B0%5D%5Bname%5D=MultiAllowanceDetailOriginalEmployeeMultiAllowanceRecordList&pData%5B1%5D%5Bvalue%5D=MultiAllowanceDetail&pData%5B1%5D%5Bname%5D=MultiAllowanceDetailItemCode&pData%5B2%5D%5Bvalue%5D=true&pData%5B2%5D%5Bname%5D=MultiAllowanceDetailHasMultipleRecord&pData%5B3%5D%5Bvalue%5D=00000000-0000-0000-0000-000000000000&pData%5B3%5D%5Bname%5D=MultiAllowanceDetailRecordID&pData%5B4%5D%5Bvalue%5D=787b382e-bf20-f011-bad0-06d40d699a17&pData%5B4%5D%5Bname%5D=MultiAllowanceDetailParentRecordID&pData%5B5%5D%5Bvalue%5D=A&pData%5B5%5D%5Bname%5D=MultiAllowanceDetailDataChangeType&pData%5B6%5D%5Bvalue%5D=%7B%22OriginalEmployeeMultiAllowanceRecordList%22%3A%5B%7B%22RecordID%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22TargetRecordID%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22ParentRecordID%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22AllowanceCode%22%3A%22%23AR_BASC%22%2C%22DateStart%22%3A%222018-02-23T00%3A00%3A00%22%2C%22DateEnd%22%3A%220001-01-01T00%3A00%3A00%22%2C%22Quantity%22%3A12345%2C%22CurrencyCode%22%3A%22%22%2C%22RunType%22%3A%22M%22%2C%22PayRunBatch%22%3A%22%22%2C%22DetailRemarks%22%3A%22%22%2C%22DataChangeType%22%3Anull%2C%22EmployeeCode%22%3A%22TH012%22%2C%22PSMultiAllowanceRecordID%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22PSMultiAllowanceRecordIDOriginal%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22EmployeeCodeOriginal%22%3A%22TH012%22%2C%22TargetRecordIDOriginal%22%3A%22d524d01f-1983-e811-99c4-f430b99edb31%22%2C%22ParentRecordIDOriginal%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22AllowanceCodeOriginal%22%3A%22%23AR_BASC%22%2C%22DateStartOriginal%22%3A%222018-02-23T00%3A00%3A00%22%2C%22DateEndOriginal%22%3A%220001-01-01T00%3A00%3A00%22%2C%22QuantityOriginal%22%3A12345%2C%22CurrencyCodeOriginal%22%3A%22%22%2C%22RunTypeOriginal%22%3A%22M%22%2C%22PayRunBatchOriginal%22%3A%22%22%2C%22DetailRemarksOriginal%22%3A%22%22%2C%22Old%22%3Anull%2C%22AdditionalMessages%22%3Anull%7D%5D%2C%22ItemCode%22%3A%22MultiAllowanceDetail%22%2C%22HasMultipleRecord%22%3Atrue%2C%22RecordID%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22ParentRecordID%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22DataChangeType%22%3A%22A%22%2C%22OriginalValues%22%3Anull%2C%22TargetRecordID%22%3A%2200000000-0000-0000-0000-000000000000%22%2C%22IsHasDataChange%22%3Afalse%2C%22EmployeeCode%22%3A%22TH012%22%2C%22SubmitRole%22%3A%22%22%2C%22ScreenName%22%3A%22MultiAllowanceDetail%22%2C%22IsSingle%22%3Afalse%2C%22IsHR%22%3Afalse%2C%22CanAddNew%22%3Atrue%2C%22DateStart%22%3A%220001-01-01T00%3A00%3A00%22%2C%22DateStartUI%22%3A%220001-01-01T00%3A00%3A00%22%2C%22AttachmentID%22%3Anull%2C%22SubmitterRequest%22%3Anull%2C%22SkillCodeUI%22%3Anull%2C%22SkillCode%22%3Anull%2C%22MultiDetailRecord%22%3Anull%2C%22PSCAccess%22%3A%7B%22RetrieveLatestData%22%3Afalse%2C%22RequireApproval%22%3Anull%2C%22ScreenName%22%3A%22MultiAllowanceDetail%22%2C%22ScreenAccess%22%3A%22*%22%2C%22SubmissionMessage%22%3A%22%22%2C%22RequireAcknowledgement%22%3A%22%22%2C%22Sequence%22%3A3%2C%22Enabled%22%3Atrue%2C%22RestrictModify%22%3Afalse%2C%22AllowAttachment%22%3A%22%22%2C%22AttachmentRequiredCountryCodes%22%3A%22%22%2C%22AttachmentOptionalCountryCodes%22%3A%22%22%2C%22RestrictDelete%22%3Afalse%2C%22AttachmentAccess%22%3A%22%22%2C%22LatestDetail%22%3Afalse%2C%22CountryCodes%22%3A%22%22%2C%22TagField%22%3A%22%22%2C%22Caption%22%3Anull%2C%22HasWritableField%22%3Afalse%2C%22HasReadableField%22%3Afalse%2C%22Name%22%3Anull%2C%22AllowAttachmentRequired%22%3Anull%2C%22AllowAttachmentOptional%22%3Anull%2C%22AllowAttachmentNotAvailable%22%3Anull%2C%22DisplayScreenName%22%3A%22MultiAllowanceDetail%22%2C%22Old%22%3Anull%2C%22AdditionalMessages%22%3Anull%7D%2C%22TargetTableName%22%3A%22TblRecurring%22%2C%22KeyFields%22%3A%5B%5D%2C%22SelectionName%22%3A%22PSMultiAllowanceDetail%22%2C%22Old%22%3Anull%2C%22AdditionalMessages%22%3Anull%7D&pData%5B6%5D%5Bname%5D=MultiAllowanceDetailOriginalValues&pData%5B7%5D%5Bvalue%5D=00000000-0000-0000-0000-000000000000&pData%5B7%5D%5Bname%5D=MultiAllowanceDetailTargetRecordID&pData%5B8%5D%5Bvalue%5D=false&pData%5B8%5D%5Bname%5D=MultiAllowanceDetailIsHasDataChange&pData%5B9%5D%5Bvalue%5D=TH012&pData%5B9%5D%5Bname%5D=MultiAllowanceDetailEmployeeCode&pData%5B10%5D%5Bvalue%5D=%25&pData%5B10%5D%5Bname%5D=MultiAllowanceDetailSubmitRole&pData%5B11%5D%5Bvalue%5D=MultiAllowanceDetail&pData%5B11%5D%5Bname%5D=MultiAllowanceDetailScreenName&pData%5B12%5D%5Bvalue%5D=false&pData%5B12%5D%5Bname%5D=MultiAllowanceDetailIsSingle&pData%5B13%5D%5Bvalue%5D=false&pData%5B13%5D%5Bname%5D=MultiAllowanceDetailIsHR&pData%5B14%5D%5Bvalue%5D=true&pData%5B14%5D%5Bname%5D=MultiAllowanceDetailCanAddNew&pData%5B15%5D%5Bvalue%5D=0001-01-01T00%3A00%3A00&pData%5B15%5D%5Bname%5D=MultiAllowanceDetailDateStart&pData%5B16%5D%5Bvalue%5D=0001-01-01T00%3A00%3A00&pData%5B16%5D%5Bname%5D=MultiAllowanceDetailDateStartUI&pData%5B17%5D%5Bvalue%5D=&pData%5B17%5D%5Bname%5D=MultiAllowanceDetailAttachmentID&pData%5B18%5D%5Bvalue%5D=&pData%5B18%5D%5Bname%5D=MultiAllowanceDetailSubmitterRequest&pData%5B19%5D%5Bvalue%5D=&pData%5B19%5D%5Bname%5D=MultiAllowanceDetailSkillCodeUI&pData%5B20%5D%5Bvalue%5D=&pData%5B20%5D%5Bname%5D=MultiAllowanceDetailSkillCode&pData%5B21%5D%5Bvalue%5D=%5Bobject+Object%5D&pData%5B21%5D%5Bname%5D=MultiAllowanceDetailMultiDetailRecord&pData%5B22%5D%5Bvalue%5D=TblRecurring&pData%5B22%5D%5Bname%5D=MultiAllowanceDetailTargetTableName&pData%5B23%5D%5Bvalue%5D=&pData%5B23%5D%5Bname%5D=MultiAllowanceDetailKeyFields&pData%5B24%5D%5Bvalue%5D=PSMultiAllowanceDetail&pData%5B24%5D%5Bname%5D=MultiAllowanceDetailSelectionName&pData%5B25%5D%5Bvalue%5D=&pData%5B25%5D%5Bname%5D=MultiAllowanceDetailOld&pData%5B26%5D%5Bvalue%5D=&pData%5B26%5D%5Bname%5D=MultiAllowanceDetailAdditionalMessages&pData%5B27%5D%5Bvalue%5D=787b382e-bf20-f011-bad0-06d40d699a17&pData%5B27%5D%5Bname%5D=RecordID&pData%5B28%5D%5Bvalue%5D=9d89fc50-861b-4cac-a6c5-be37344cd19b&pData%5B28%5D%5Bname%5D=RequestID&pData%5B29%5D%5Bvalue%5D=00000000-0000-0000-0000-000000000000&pData%5B29%5D%5Bname%5D=PreviousRecordID&pData%5B30%5D%5Bvalue%5D=TH012&pData%5B30%5D%5Bname%5D=EmployeeCode&pData%5B31%5D%5Bvalue%5D=%25&pData%5B31%5D%5Bname%5D=SubmitRole&pData%5B32%5D%5Bvalue%5D=&pData%5B32%5D%5Bname%5D=QuestCode&pData%5B33%5D%5Bvalue%5D=&pData%5B33%5D%5Bname%5D=WorkflowSessionKey&pData%5B34%5D%5Bvalue%5D=&pData%5B34%5D%5Bname%5D=MultiManagerDetailOriginalValues&pData%5B35%5D%5Bvalue%5D=&pData%5B35%5D%5Bname%5D=MultiManagerDetailRecordID&pData%5B36%5D%5Bvalue%5D=*&pData%5B36%5D%5Bname%5D=StatusChangeReasonCodes&pData%5B37%5D%5Bvalue%5D=&pData%5B37%5D%5Bname%5D=Justification&pData%5B38%5D%5Bvalue%5D=&pData%5B38%5D%5Bname%5D=NextApproverEC&pData%5B39%5D%5Bname%5D=QuestFormData&pScreenChange=%5B%22MultiAllowanceDetail%22%2C%22MultiAllowanceDetail%22%5D&pEmployeeCode=TH012&pRole=%25&pWorkflowAction=Approve&pRecordID=787b382e-bf20-f011-bad0-06d40d699a17&pReasonCode=&pRequestID=9d89fc50-861b-4cac-a6c5-be37344cd19b&pIsHR=false&pFormData=&pNextApprover=';
encodedData =
'simple=value&array[0]=first&array[1]=second&obj[key]=value&nested[obj][key]=deep';
encodedData = 'numbers=123&boolean=true&json=%7B%22key%22%3A%22value%22%7D';
const decodedData = parseUrlEncodedData(encodedData);
console.log(decodedData);
/*
{
simple: "value",
array: ["first", "second"],
obj: { key: "value" },
nested: { obj: { key: "deep" } }
}
*/
/*
{
"numbers": 123,
"boolean": true,
"json": {
"key": "value"
}
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment