//Helper function that generates a TaskProcedure object from a JSONClass that contains TaskProcedures in the proper format public static TaskProcedure getTaskProcedureFromJSON(JSONClass taskClass) { if (taskClass["TaskProcedure"] == null) { Debug.LogError("Error: JSON does not include TaskProcedure object. See example JSON for help."); Application.Quit(); } TaskProcedure taskProcedure = new TaskProcedure(); JSONArray taskArray = taskClass["TaskProcedure"].AsArray; int taskIndex = 0; for (int i = 0; i < taskArray.Count; i++) { if (taskArray[i]["ConditionalEvent"] != null) { JSONClass task = taskArray[i].AsObject; taskProcedure.addTask(CreateConditionalEventFromJSON(taskClass, task, taskIndex)); taskIndex++; } if (taskArray[i]["RepeatedEvent"] != null) { JSONArray subParameters = taskArray[i]["RepeatedEvent"]["SubstitutionParameters"].AsArray; //Find the minimum parameter length int minParams = int.MaxValue; for (int j = 0; j < subParameters.Count; j++) { JSONArray parameterValues = subParameters[j]["ParameterValues"].AsArray; if (parameterValues.Count < minParams) minParams = parameterValues.Count; } //Get the template for the conditional events to be generated and save independent copies for each parameter string templatesString = taskArray[i]["RepeatedEvent"]["ConditionalEventTemplates"].ToString(); string[] conditionalEventsStrings = new string[minParams]; for (int j = 0; j < conditionalEventsStrings.Length; j++) conditionalEventsStrings[j] = templatesString; //Iterate through the parameter lists and replace values in each conditional event for (int j = 0; j < subParameters.Count; j++) { string parameterSubstitutionString = subParameters[j]["ParameterSubstitutionString"]; JSONArray parameterValues = subParameters[j]["ParameterValues"].AsArray; string[] substitutionValues = new string[minParams]; for (int k = 0; k < minParams; k++) substitutionValues[k] = parameterValues[k]; //substitutionValues holds the list of values to be replaced in each consecutive runthrough //conditionalEventsStrings holds the runthrough templates //for each parameter, replace the substring in each result with the subvalue for (int k = 0; k < substitutionValues.Length; k++) { conditionalEventsStrings[k] = conditionalEventsStrings[k].Replace(parameterSubstitutionString, substitutionValues[k]); //int pos = conditionalEventsStrings[k].IndexOf(parameterSubstitutionString); //if (pos < 0) break; //conditionalEventsStrings[k] = conditionalEventsStrings[k].Substring(0, pos) + substitutionValues[k] + conditionalEventsStrings[k].Substring(pos + parameterSubstitutionString.Length); } } for (int j = 0; j < conditionalEventsStrings.Length; j++) { JSONArray conditionalEvent = JSONArray.Parse(conditionalEventsStrings[j]).AsArray; for (int k = 0; k < conditionalEvent.Count; k++) { taskProcedure.addTask(CreateConditionalEventFromJSON(taskClass, conditionalEvent[k].AsObject, taskIndex)); taskIndex++; } } } } return taskProcedure; }