Example #1
0
        /// <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);
        }
Example #2
0
        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);
            }
        }