private static void JsonSerializeList(this JsonWriter writer,
                                              IEnumerable list)
        {
            foreach (var item in list)
            {
                if (null == item)
                {
                    continue;
                }

                writer.Object();
                writer.JsonSerializeObject(item);
            }

            writer.EndArray();
        }
        public static string JsonSerialize(this object value,
                                           JsonWriterSettings settings)
        {
            if (null == value)
            {
                return null;
            }

            if (null == settings)
            {
                throw new ArgumentNullException("settings");
            }

            using (var stream = new MemoryStream())
            {
                using (var writer = new JsonWriter(stream, settings))
                {
                    var list = value as IEnumerable;
                    if (value.GetType().IsArray)
                    {
                        writer.Array();
                        writer.JsonSerializeList(list);
                    }
                    else
                    {
                        writer.Object();
                        writer.JsonSerializeObject(value);
                    }
                }

                using (var reader = new StreamReader(stream))
                {
                    return reader.ReadToEnd();
                }
            }
        }
        public static string JsonSerialize(this object value,
                                           JsonWriterSettings settings)
        {
            if (null == value)
            {
                return(null);
            }

            if (null == settings)
            {
                throw new ArgumentNullException("settings");
            }

            using (var stream = new MemoryStream())
            {
                using (var writer = new JsonWriter(stream, settings))
                {
                    var list = value as IEnumerable;
                    if (value.GetType().IsArray)
                    {
                        writer.Array();
                        writer.JsonSerializeList(list);
                    }
                    else
                    {
                        writer.Object();
                        writer.JsonSerializeObject(value);
                    }
                }

                using (var reader = new StreamReader(stream))
                {
                    return(reader.ReadToEnd());
                }
            }
        }
        private static void JsonSerializeObject(this JsonWriter writer,
                                                object obj)
        {
            if (null == obj)
            {
                return;
            }

            var properties = obj
                             .GetType()
                             .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                             .ToList();

            foreach (var property in properties)
            {
                if (!property.CanRead)
                {
                    continue;
                }

                if (0 != property.GetIndexParameters().Length)
                {
                    continue;
                }

                var ignore = property.GetCustomAttributes(typeof(JsonIgnoreAttribute), true);
                if (0 != ignore.Length)
                {
                    continue;
                }

                var name = property.Name.ToCamelCase();
                foreach (JsonNameAttribute attribute in property.GetCustomAttributes(typeof(JsonNameAttribute), true))
                {
                    name = attribute.Name;
                }

                var value = property.GetValue(obj, null);

                if (writer.JsonSerializeBaseClassLibraryType(name, value))
                {
                    continue;
                }

                writer.Object(name);

                var serializable = value as IJsonSerializable;
                if (null == serializable)
                {
                    writer.JsonSerializeObject(value);
                }
                else
                {
                    serializable.WriteJson(writer);
                    writer.EndObject();
                }
            }

            var list = obj as IEnumerable;

            if (null != list)
            {
                writer.Array(writer.Settings.ItemsName);
                foreach (var item in list)
                {
                    if (writer.JsonSerializeBaseClassLibraryType(null, item))
                    {
                        continue;
                    }

                    writer.Object();
                    writer.JsonSerializeObject(item);
                }

                writer.EndArray();
            }

            writer.EndObject();
        }