/// <summary> /// populating an array of objects /// </summary> /// <param name="eventObject"></param> /// <param name="objectSource"></param> /// <param name="jsonCollection"></param> /// <param name="objectName"></param> /// <returns></returns> private static object Map2RequestedChildren(object eventObject, DefinitionsObject sourceDefinitions, List <KeyValuePair <string, string> > jsonCollection) { /// Get Event Map var eventMap = JObject.Parse(jsonCollection.Find(x => x.Key == "eventmap").Value.ToString()); List <KeyValuePair <string, string> > tagList = new List <KeyValuePair <string, string> >(); /// parse the source definitions for data payload and jstructure JObject jobjectTag = JObject.Parse(sourceDefinitions.tag); /// collect the data payload objects for consumption string sourcePayload = jobjectTag.SelectToken("datapayload").ToString(); /// structure to populate string jstructure = jobjectTag.SelectToken("jstructure").ToString(); /// Get Parent Object Structures from DataPayload var listOfJsonObjectsFromPayload = JsonFieldFinder.JsonFieldFinder .FindFieldsIEnumerable(sourceDefinitions.parentobject, jsonCollection.Find(x => x.Key == sourcePayload).Value.ToString(), WildcardsJPaths); /// Get JStructure Definitions var jstructureDefinitions = JsonFieldFinder.JsonFieldFinder .FindFieldsJObject("definitions." + jstructure, jsonCollection.Find(x => x.Key == "eventmap").Value.ToString(), WildcardsJPaths, jstructure); (bool required, bool deleteifnull, object fieldvalue)fieldValue; /// There is an inversion of the driver for objects /// in this case the collection queried from the datapayload /// will drive the population of the json object structures. /// start a parent loop of each /// will return an array JArray returnObject = new JArray(); //store the internal payload for querying the field value List <KeyValuePair <string, string> > datapayloads = new List <KeyValuePair <string, string> >(); /// Hydrate the JStructure foreach (var ea in listOfJsonObjectsFromPayload.Children().ToArray()) { /// Get JStructure Object var rawJstructure = JsonFieldFinder.JsonFieldFinder .FindFieldsIEnumerable("jsonstructures." + jstructure, jsonCollection.Find(x => x.Key == "eventmap").Value.ToString(), WildcardsJPaths); /// establish an instance of the jstructure foreach (var jstruct in rawJstructure.Children().ToArray()) { // get the value for the field datapayloads.Add(new KeyValuePair <string, string>("internal", ea.ToString(Newtonsoft.Json.Formatting.None))); fieldValue = getFieldValue(jstructureDefinitions, jstructure + "." + ((JProperty)jstruct).Name.ToString(), datapayloads, eventObject); if (fieldValue.required && (fieldValue.fieldvalue == null || String.IsNullOrEmpty(fieldValue.fieldvalue.ToString()))) { ///send error that there is a null for a required field string fieldName = ((JProperty)jstruct).Name; throw new Exception($"JSONMapper: required field missing. {fieldName} "); } else if (fieldValue.deleteifnull && (fieldValue.fieldvalue == null || String.IsNullOrEmpty(fieldValue.fieldvalue.ToString()))) { ///delete the field iff field value is null jstruct.Remove(); } else { ///assign the value to the property ((JProperty)jstruct).Value = ((fieldValue.fieldvalue).GetType().Name.ToString() == "JValue") ? fieldValue.fieldvalue.ToString() : JToken.FromObject(fieldValue.fieldvalue); } } returnObject.Add(rawJstructure); rawJstructure = null; datapayloads.Clear(); } return((object)returnObject); }
private static (bool required, bool remove, object fieldvalue) getFieldValue( JObject Definitions, string path, List <KeyValuePair <string, string> > jsonCollection, object eventObject) { /// access the eventObject for instantiating the methods for expressions /// Parse the Field Definitions var datapayload = ((JValue)Definitions .SelectToken(path + ".datapayload")).Value.ToString(); var parentobject = ((JValue)Definitions .SelectToken(path + ".parentobject")).Value.ToString(); var filterexpression = ((JValue)Definitions .SelectToken(path + ".filterexpression")).Value.ToString(); var required = ((JValue)Definitions .SelectToken(path + ".required")).Value.ToString(); var deleteifnull = ((JValue)Definitions .SelectToken(path + ".deleteifnull")).Value.ToString(); var tag = ((JValue)Definitions .SelectToken(path + ".tag")).Value.ToString(); object returnObject = null; /// parse datapayload based on a keyword if (_dataPayloadKeywords.Any(x => x.Key == datapayload)) { KeyValuePair <string, string> dataPayloadType = _dataPayloadKeywords.FirstOrDefault(x => x.Key == datapayload); switch (dataPayloadType.Key) { case "JObject": /// another JsonObject Structure { returnObject = Map2RequestedChild(eventObject, parentobject, jsonCollection); return(Convert.ToBoolean(required), Convert.ToBoolean(deleteifnull), returnObject); } case "EObject": /// calling a method of the EventObject { /// filter expression contains eventobject method name MethodInfo methodInfo = eventObject.GetType().GetMethod(filterexpression); /// tag contains the arguments for the method returnObject = methodInfo.Invoke(eventObject, (String.IsNullOrEmpty(tag)) ? null : new object[] { tag }); return(Convert.ToBoolean(required), Convert.ToBoolean(deleteifnull), returnObject); } case "JArray": /// another JsonObject Structure { DefinitionsObject sourceDefinitions = new DefinitionsObject { datapayload = datapayload, parentobject = parentobject, filterexpression = filterexpression, required = required, deleteifnull = deleteifnull, tag = tag }; returnObject = Map2RequestedChildren(eventObject, sourceDefinitions, jsonCollection); return(Convert.ToBoolean(required), Convert.ToBoolean(deleteifnull), returnObject); } default: { ///send error that there is a null for a required field throw new Exception($"JSONMapper: Unknown Custom Object Keyword."); } } } else { /// Apply Field Definitions try { JToken rawParentToken = JObject.Parse(jsonCollection.FirstOrDefault(x => x.Key == datapayload) .Value.ToString()).SelectToken(parentobject + "." + filterexpression); //if (rawParentToken == null) //{ // JObject rawParentObject = JsonFieldFinder.JsonFieldFinder // .FindFieldsJObject((!String.IsNullOrEmpty(parentobject) ? // parentobject + "." + filterexpression : filterexpression), // jsonCollection.Find(x => x.Key == // datapayload).Value, // WildcardsJPaths, filterexpression); // /// test the rawParentObject for a value // returnObject = (rawParentObject.First != null) ? // ((JProperty)rawParentObject.First).Value : null; //} //else //{ /// test the rawParentObject for a value returnObject = (rawParentToken != null) ? ((JValue)rawParentToken).Value : null; //} } catch { returnObject = null; } return(Convert.ToBoolean(required), Convert.ToBoolean(deleteifnull), returnObject); } }