global class Act_JsonColumnRepeaterDemo implements cadmus_core.AbstractBeforeActionable { global void execute(cadmus_core__Actionable__c actionable, Id docConfig, Id objectId, Map inputMap, cadmus_core.ConvertController.ConvertDataModel cdm) { JSONParser jp=JSON.createParser('{"consumptions":{"january":{"day":15,"night":12},"february":{"day":11,"night":13},"march":{"day":15,"night":13},"april":{"day":14,"night":10},"may":{"day":10,"night":9},"june":{"day":7,"night":8},"july":{"day":6,"night":6}}}'); // Do not use "deserialize*" as map do not preserve order of keys. JSONToken token=jp.nextToken(); Integer level=0; List months=new List(); Set periods = new Set(); List orderedPeriods=new List(); // Not using a set Map> periodValues=new Map>(); Map> monthValues=new Map>(); String currentPeriod = ''; String currentMonth = ''; List> colDataList = new List>(); List> rowsDataList = new List>(); Map suffixes = new Map(); Integer c = 0; while(token!=null){ switch on token{ when START_OBJECT { level = level + 1; } when END_OBJECT { level = level - 1; } when FIELD_NAME { if(level==2){ // At month level months.add(jp.getText()); currentMonth=jp.getText(); } if(level==3){ currentPeriod=jp.getText(); if (periods.add(currentPeriod)) { orderedPeriods.add(currentPeriod); Map recordRow = new Map(); recordRow.put('when', currentPeriod); colDataList.add(recordRow); if(c==0) { suffixes.put(currentPeriod, ''); } else { suffixes.put(currentPeriod, '_' + c); } c++; } } } when VALUE_NUMBER_INT { if(level==3) { Map recordRow=periodValues.get(currentMonth); if(recordRow==null) { recordRow=new Map(); recordRow.put('month', currentMonth); rowsDataList.add(recordRow); } recordRow.put('value' + suffixes.get(currentPeriod), jp.getText()); periodValues.put(currentMonth,recordRow); } } } token=jp.nextToken(); } System.debug(String.join(months,',')); System.debug(String.join(orderedPeriods,',')); System.debug(periodValues); System.debug(rowsDataList); String colsDs = '00D2p000000QL9s_a022p00000pZwFy'; String rowsDs = '00D2p000000QL9s_a022p00000pZwFz'; List dsList = new List {colsDs,rowsDs}; //Get DataSources List dss = [SELECT Id, Name, cadmus_core__CustomerDataSourceId__c,cadmus_core__Image_Name__c From cadmus_core__Data_Source__c WHERE cadmus_core__CustomerDataSourceId__c IN :dsList ]; Map dsMap = new Map(); for(cadmus_core__Data_Source__c ds : dss) { dsMap.put(ds.cadmus_core__CustomerDataSourceId__c, ds); } inputMap.put(dsMap.get(colsDs).Id,colDataList); inputMap.put(dsMap.get(rowsDs).Id,rowsDataList); } }