private static ICollection <SCIMRepresentationAttribute> ExtractRepresentationAttributesFromJSON(
            ICollection <SCIMSchema> schemas,
            ICollection <SCIMSchemaAttribute> schemaAttributes,
            object obj,
            bool ignoreUnsupportedCanonicalValues)
        {
            var result = new List <SCIMRepresentationAttribute>();
            var jArr   = obj as JArray;
            var jObj   = obj as JObject;

            if (jObj != null && schemaAttributes != null &&
                schemaAttributes.Any() &&
                schemaAttributes.Count() == 1 &&
                schemaAttributes.First().Type == SCIMSchemaAttributeTypes.COMPLEX)
            {
                jArr = new JArray();
                jArr.Add(jObj);
            }

            var mainSchema       = schemas.First(s => s.IsRootSchema);
            var extensionSchemas = schemas.Where(s => !s.IsRootSchema).ToList();

            if (jArr != null)
            {
                var schemaAttr = schemaAttributes.First();
                var schema     = schemas.FirstOrDefault(s => s.HasAttribute(schemaAttr));
                result.AddRange(SCIMRepresentationHelper.BuildAttributes(jArr, schemaAttr, schema, ignoreUnsupportedCanonicalValues));
            }
            else if (jObj != null)
            {
                var resolutionResult = SCIMRepresentationHelper.Resolve(jObj, mainSchema, extensionSchemas);
                result.AddRange(SCIMRepresentationHelper.BuildRepresentationAttributes(resolutionResult, resolutionResult.AllSchemaAttributes, ignoreUnsupportedCanonicalValues, true));
            }
            else if (schemaAttributes.Any() && schemaAttributes.Count() == 1)
            {
                var schemaAttribute = schemaAttributes.First();
                switch (schemaAttribute.Type)
                {
                case SCIMSchemaAttributeTypes.BOOLEAN:
                    result.Add(new SCIMRepresentationAttribute(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), schemaAttribute, schemaAttribute.SchemaId, valueBoolean: bool.Parse(obj.ToString())));
                    break;

                case SCIMSchemaAttributeTypes.STRING:
                    result.Add(new SCIMRepresentationAttribute(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), schemaAttribute, schemaAttribute.SchemaId, valueString: obj.ToString()));
                    break;

                case SCIMSchemaAttributeTypes.INTEGER:
                    result.Add(new SCIMRepresentationAttribute(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), schemaAttribute, schemaAttribute.SchemaId, valueInteger: int.Parse(obj.ToString())));
                    break;

                case SCIMSchemaAttributeTypes.DATETIME:
                    result.Add(new SCIMRepresentationAttribute(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), schemaAttribute, schemaAttribute.SchemaId, valueDateTime: DateTime.Parse(obj.ToString())));
                    break;
                }
            }

            return(result);
        }
        private static ICollection <SCIMRepresentationAttribute> ExtractRepresentationAttributesFromJSON(ICollection <SCIMSchemaAttribute> schemaAttributes, object obj, bool ignoreUnsupportedCanonicalValues)
        {
            var result = new List <SCIMRepresentationAttribute>();
            var jArr   = obj as JArray;
            var jObj   = obj as JObject;

            if (jObj != null && schemaAttributes != null &&
                schemaAttributes.Any() &&
                schemaAttributes.Count() == 1 &&
                schemaAttributes.First().Type == SCIMSchemaAttributeTypes.COMPLEX &&
                schemaAttributes.First().MultiValued)
            {
                jArr = new JArray();
                jArr.Add(jObj);
            }

            if (jArr != null)
            {
                result.AddRange(SCIMRepresentationHelper.BuildAttributes(jArr, schemaAttributes.First(), ignoreUnsupportedCanonicalValues));
            }
            else if (jObj != null)
            {
                result.AddRange(SCIMRepresentationHelper.BuildRepresentationAttributes(jObj, schemaAttributes, ignoreUnsupportedCanonicalValues, true));
            }
            else if (schemaAttributes.Any() && schemaAttributes.Count() == 1)
            {
                var schemaAttribute = schemaAttributes.First();
                switch (schemaAttribute.Type)
                {
                case SCIMSchemaAttributeTypes.BOOLEAN:
                    result.Add(new SCIMRepresentationAttribute(Guid.NewGuid().ToString(), schemaAttribute, valuesBoolean: new List <bool> {
                        bool.Parse(obj.ToString())
                    }));
                    break;

                case SCIMSchemaAttributeTypes.STRING:
                    result.Add(new SCIMRepresentationAttribute(Guid.NewGuid().ToString(), schemaAttribute, valuesString: new List <string> {
                        obj.ToString()
                    }));
                    break;

                case SCIMSchemaAttributeTypes.INTEGER:
                    result.Add(new SCIMRepresentationAttribute(Guid.NewGuid().ToString(), schemaAttribute, valuesInteger: new List <int> {
                        int.Parse(obj.ToString())
                    }));
                    break;

                case SCIMSchemaAttributeTypes.DATETIME:
                    result.Add(new SCIMRepresentationAttribute(Guid.NewGuid().ToString(), schemaAttribute, valuesDateTime: new List <DateTime> {
                        DateTime.Parse(obj.ToString())
                    }));
                    break;
                }
            }

            return(result);
        }