'APEX: Sorting issue in wrapper collection
I'm parsing the input JSON using my wrapper class. But, getting an error message when calling the sort function of wrapper class:
List<PPLUsersPerformanceWrapper> MarketingSources = PPLUsersPerformanceWrapper.parse(fpsLeadSettingList[0].PPL_Users_Performance__c);
System.debug(MarketingSources != null);
for(PPLUsersPerformanceWrapper MarketingSource:MarketingSources)
{
MarketingSource.Users.sort(); //getting error as shared below.
}
Error: Your Developer Console session has been idle. To resume logging and listening for updates, click Resume below or click Debug -> Resume at a later time.
PPLUsersPerformanceWrapper class:
//This wrapper class is used to parse PPL's JSON config stored
global class PPLUsersPerformanceWrapper{
public String Source {get;set;}
public List<Users> Users {get;set;}
public enum SORT_BY {
USERconversion_rate, USERleads_recieved
}
public PPLUsersPerformanceWrapper(JSONParser parser) {
while (parser.nextToken() != System.JSONToken.END_OBJECT) {
if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
String text = parser.getText();
if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
if (text == 'Source') {
Source = parser.getText();
} else if (text == 'Users') {
Users = arrayOfUsers(parser);
} else {
System.debug(LoggingLevel.WARN, 'PPLUsersPerformanceWrapper consuming unrecognized property: '+text);
consumeObject(parser);
}
}
}
}
}
global class Users implements Comparable{
global String User_id {get;set;}
global Double User_conversion_rate {get;set;}
global Integer User_leads_recieved {get;set;}
//public Double USERConversion_rate {get;set;}
//public Integer USERleads_recieved {get;set;}
global Users(JSONParser parser) {
while (parser.nextToken() != System.JSONToken.END_OBJECT) {
if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
String text = parser.getText();
if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
if (text == 'User_id') {
User_id = parser.getText();
} else if (text == 'User_conversion_rate') {
User_conversion_rate = parser.getDoubleValue();
} else if (text == 'User_leads_recieved') {
User_leads_recieved = parser.getIntegerValue();
}else {
System.debug(LoggingLevel.WARN, 'Users consuming unrecognized property: '+text);
consumeObject(parser);
}
}
}
}
}
global integer compareTo(Object recordTocompare){
return compareTo(((Users)recordTocompare).User_leads_recieved);
}
}
public static List<PPLUsersPerformanceWrapper> parse(String json) {
System.JSONParser parser = System.JSON.createParser(json);
return arrayOfPPLUsersPerformanceWrapper(parser);
}
public static void consumeObject(System.JSONParser parser) {
Integer depth = 0;
do {
System.JSONToken curr = parser.getCurrentToken();
if (curr == System.JSONToken.START_OBJECT ||
curr == System.JSONToken.START_ARRAY) {
depth++;
} else if (curr == System.JSONToken.END_OBJECT ||
curr == System.JSONToken.END_ARRAY) {
depth--;
}
} while (depth > 0 && parser.nextToken() != null);
}
private static List<PPLUsersPerformanceWrapper> arrayOfPPLUsersPerformanceWrapper(System.JSONParser p) {
List<PPLUsersPerformanceWrapper> res = new List<PPLUsersPerformanceWrapper>();
if (p.getCurrentToken() == null) p.nextToken();
while (p.nextToken() != System.JSONToken.END_ARRAY) {
res.add(new PPLUsersPerformanceWrapper(p));
}
return res;
}
private static List<Users> arrayOfUsers(System.JSONParser p) {
List<Users> res = new List<Users>();
if (p.getCurrentToken() == null) p.nextToken();
while (p.nextToken() != System.JSONToken.END_ARRAY) {
res.add(new Users(p));
}
return res;
}
}
Solution 1:[1]
Are you sure about this:
global integer compareTo(Object recordTocompare){
return compareTo(((Users)recordTocompare).User_leads_recieved);
}
Do you have "more accurate" compareTo() method in this class that uses an integer? because if you don't - you might be a victim of recursion, infinite loop. I mean ok, developer console dies... but what if you use setup -> debug logs, does it capture anything? Does it look like it calls compareTo() until stack depth runs out (20 from what I remember) or apex cpu time exceeded?
Did you perhaps plan to write something like
return this.User_leads_recieved - ((Users)recordTocompare).User_leads_recieved;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | eyescream |
