现在的位置: 首页 > 综合 > 正文

垃圾JSON

2012年05月20日 ⁄ 综合 ⁄ 共 2632字 ⁄ 字号 评论关闭
public static string ToJson<T>(IEnumerable<T> enumerable) where T : new()
        {
            var tor = enumerable.GetEnumerator();
            if (!tor.MoveNext())
            {
                return "[]";
            }
            StringBuilder result = new StringBuilder("[");
            var entityType = typeof(T);
            do
            {
                bool first = true;
                foreach (var property in EntityUtility.GetEnumerable(entityType))
                {
                    if (!property.EntityProperty.CanRead)
                    {
                        continue;
                    }
                    if (first)
                    {
                        result.Append('{').Append(property.MappedName).Append(':');
                        AppendJSONValue(result, property.EntityProperty.PropertyType, property.GetValue(tor.Current));
                        first = false;
                    }
                    else
                    {
                        result.Append(',').Append(property.MappedName).Append(':');
                        AppendJSONValue(result, property.EntityProperty.PropertyType, property.GetValue(tor.Current));
                    }
                }
                result.Append("},");
            }
            while (tor.MoveNext());
            result.Length--;
            return result.Append(']').ToString();
        }

        public static IEnumerable<T> ToEnumerable<T>(string json) where T : new()
        {
            string[] array = Regex.Split(json, ",{");
            if (array.Length == 0)
            {
                yield break;
            }
            var entityType = typeof(T);
            Func<string, T> func = jObj =>
            {
                T entity = Activator.CreateInstance<T>();
                foreach (var property in EntityUtility.GetEnumerable(entityType))
                {
                    if (!property.EntityProperty.CanWrite)
                    {
                        continue;
                    }
                    foreach (string dictionarys in jObj.Split(','))
                    {
                        string[] dictionary = dictionarys.Split(':');
                        if (dictionary.Length == 2 && dictionary[0] == property.MappedName)
                        {
                            switch (Type.GetTypeCode(property.EntityProperty.PropertyType))
                            {
                                case TypeCode.Boolean:
                                    property.SetValue(entity, dictionary[1] == "true");
                                    break;
                                case TypeCode.DateTime:
                                    string[] time = dictionary[1].Substring(9, dictionary[1].Length - 10).Split(',');
                                    property.SetValue(entity, new DateTime(int.Parse(time[0]), int.Parse(time[1]) + 1, int.Parse(time[2]), int.Parse(time[3]), int.Parse(time[4]), int.Parse(time[5])));
                                    break;
                                case TypeCode.String:
                                    property.SetValue(entity, dictionary[1].Substring(1, dictionary[1].Length - 2));
                                    break;
                                default:
                                    property.SetValue(entity, property.ChangeType(dictionary[1]));
                                    break;
                            }
                        }
                    }
                }
                return entity;
            };
            yield return func(String.Concat("{", array[0]));
            for (int i = 1; i < array.Length; i++)
            {
                yield return func(array[i]);
            }
        }
        internal static void AppendJSONValue(StringBuilder buffer, Type type, object value)
        {
            if (value == null)
            {
                buffer.Append("null");
                return;
            }
            switch (Type.GetTypeCode(type))
            {
                case TypeCode.Boolean:
                    buffer.Append(value.ToString().ToLower());
                    break;
                case TypeCode.DateTime:
                    DateTime time = Convert.ToDateTime(value);
                    buffer.Append("new Date(")
                        .Append(time.Year).Append(',')
                        .Append(time.Month - 1).Append(',')
                        .Append(time.Day).Append(',')
                        .Append(time.Hour).Append(',')
                        .Append(time.Minute).Append(',')
                        .Append(time.Second).Append(')');
                    break;
                case TypeCode.String:
                    buffer.Append('"').Append(value.ToString()
                        .Replace("\r\n", string.Empty)
                        .Replace("\n", string.Empty)
                        .Replace("\"", string.Empty)).Append('"');
                    break;
                default:
                    buffer.Append(value);
                    break;
            }
        }

抱歉!评论已关闭.