JsonTools

    public class JsonTools
    {
 

        /// <summary>
        /// Generate Json string from the object
        /// </summary>
        /// <param name="obj">Object</param>
        /// <returns>Json String</returns>
        public static string ObjectToJson(object obj)
        {
            //System.Runtime.Serialization.Json.DataContractJsonSerializer;

            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
            MemoryStream stream = new MemoryStream();
            serializer.WriteObject(stream, obj);
            byte[] dataBytes = new byte[stream.Length];
            stream.Position = 0;
            stream.Read(dataBytes, 0, (int)stream.Length);
            String dataString = Encoding.UTF8.GetString(dataBytes);
            return dataString;
        }

        /// <summary>
        /// Generate a object from Json string
        /// </summary>
        /// <param name="jsonString">Json string</param>
        /// <param name="obj">Object</param>
        /// <returns>Object</returns>
        public static object JsonToObject(string jsonString, object obj)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
            MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            obj = serializer.ReadObject(mStream);
            return obj;
        }

        /// <summary>
        /// Generate a object from Json string
        /// </summary>
        /// <param name="jsonString">Json string</param>
        /// <param name="obj">Object</param>
        /// <returns>Object</returns>
        public static T JsonToObject<T>(string jsonString)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
            {
                return (T)serializer.ReadObject(mStream);
            }
        }

        /// <summary>
        /// 序列化数据为Json数据格式.
        /// </summary>
        /// <param name="value">被序列化的对象</param>
        /// <returns></returns>
        public static string ObjectToJson2(object value)
        {
            return ObjectToJson2(value, false);
        }

        /// <summary>
        /// 序列化数据为Json数据格式.
        /// </summary>
        /// <param name="value">被序列化的对象</param>
        /// <param name="clearLastZero">是否清除小数位后的0</param>
        /// <returns></returns>
        public static string ObjectToJson2(object value, bool clearLastZero)
        {
            Type type = value.GetType();
            Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();
            //json.NullValueHandling = NullValueHandling.Ignore;
            json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;           
            json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;     
                   
            json.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
            IsoDateTimeConverter timeFormate = new IsoDateTimeConverter();
            timeFormate.DateTimeFormat = "yyyy-MM-dd";
            json.Converters.Add(timeFormate);        
            json.Formatting = Formatting.Indented;
            json.NullValueHandling = NullValueHandling.Ignore;
           
            if (clearLastZero)
                json.Converters.Add(new MinifiedNumArrayConverter());
            StringWriter sw = new StringWriter();
            Newtonsoft.Json.JsonTextWriter writer = new JsonTextWriter(sw);
            writer.Formatting = Formatting.None;
            writer.QuoteChar = '"';
            writer.QuoteName = false;
            json.Serialize(writer, value);

            string output = sw.ToString();
            writer.Close();
            sw.Close();

            return output;
        }
        /// <summary>
        /// 将Json数据转为对象
        /// </summary>
        /// <typeparam name="T">目标对象</typeparam>
        /// <param name="jsonText">json数据字符串</param>
        /// <returns></returns>
        public static T JsonToObject2<T>(string jsonText)
        {
            Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();

            json.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
            json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
            json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

            StringReader sr = new StringReader(jsonText);
            Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr);
            T result = default(T);
            try
            {
                result = (T)json.Deserialize(reader, typeof(T));
            }
            catch
            {
            }
            finally
            {
                reader.Close();
            }
            return result;
        }

        /// <summary>
        /// 普通集合转换Json
        /// </summary>
        /// <param name="array">集合对象</param>
        /// <returns>Json字符串</returns>
        public static string ListToJson(IEnumerable array)
        {

            string jsonString = "[";

            foreach (object item in array)
            {
                jsonString += ObjectToJson(item) + ",";
            }
            int t = jsonString.LastIndexOf(',');
            string strTmp = jsonString.Substring(0, t);
            return strTmp + "]";

        }


        /// <summary>   
        /// DataTable to json   
        /// </summary>   
        /// <param name="jsonName">返回json的名称</param>   
        /// <param name="dt">转换成json的表</param>   
        /// <returns></returns>   
        public string DataTableToJson(string jsonName, System.Data.DataTable dt, string strTotal = "")
        {
            StringBuilder Json = new StringBuilder();
            Json.Append("[{\"TotalCount\":\"" + strTotal + "\",\"Head\":[");
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Json.Append("{\"ColumnHead\":\"" + dt + dt.Columns[i].ColumnName + "\"}");

                if (i < dt.Columns.Count - 1)
                {
                    Json.Append(",");
                }
            }
            Json.Append("],");

            Json.Append("\"" + jsonName + "\":[");
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Json.Append("{");
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        Json.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":\"" + dt.Rows[i][j].ToString() + "\"");
                        if (j < dt.Columns.Count - 1)
                        {
                            Json.Append(",");
                        }
                    }
                    Json.Append("}");
                    if (i < dt.Rows.Count - 1)
                    {
                        Json.Append(",");
                    }
                }
            }
            Json.Append("]}]");
            return Json.ToString();
        }


        public class MinifiedNumArrayConverter : JsonConverter
        {
            private void dumpNumArray<T>(JsonWriter writer, T[] array)
            {
                foreach (T n in array)
                {
                    var s = n.ToString();
                    //此處可考慮改用string.format("{0:#0.####}")[小數後方#數目依最大小數位數決定]
                    //感謝網友vencin提供建議
                    if (s.EndsWith(".0"))
                        writer.WriteRawValue(s.Substring(0, s.Length - 2));
                    else if (s.Contains("."))
                        writer.WriteRawValue(s.TrimEnd('0'));
                    else
                        writer.WriteRawValue(s);
                }
            }

            private void dumpNum<T>(JsonWriter writer, T value)
            {
                var s = value.ToString();
                //此處可考慮改用string.format("{0:#0.####}")[小數後方#數目依最大小數位數決定]
                //感謝網友vencin提供建議
                if (s.EndsWith(".0"))
                    writer.WriteRawValue(s.Substring(0, s.Length - 2));
                else if (s.Contains("."))
                    writer.WriteRawValue(s.TrimEnd('0'));
                else
                    writer.WriteRawValue(s);
            }

            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                Type t = value.GetType();
                if (t == dblArrayType)
                {
                    writer.WriteStartArray();
                    dumpNumArray<double>(writer, (double[])value);
                    writer.WriteEndArray();
                }
                else if (t == decArrayType)
                {
                    writer.WriteStartArray();
                    dumpNumArray<decimal>(writer, (decimal[])value);
                    writer.WriteEndArray();
                }
                else if (t == decType || t == decNullType)
                {
                    dumpNum<decimal>(writer, (decimal)value);
                }
                else
                    throw new NotImplementedException();
            }

            private Type dblArrayType = typeof(double[]);
            private Type decArrayType = typeof(decimal[]);
            private Type decType = typeof(decimal);
            private Type decNullType = typeof(decimal?);

            public override bool CanConvert(Type objectType)
            {
                if (objectType == dblArrayType || objectType == decArrayType || objectType == decType || objectType == decNullType)
                    return true;
                return false;
            }

            public override bool CanRead
            {
                get { return false; }
            }

            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                throw new NotImplementedException();
            }
        }
    }

  

转载于:https://www.cnblogs.com/chenqingwei/p/9605800.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值