C#中对象与JSON字符串互相转换的四种种方式

常用的类库有:

JSON.NET, System.Text.Json,

DataContractJsonSerializer,JavaScriptSerializer

1、JSON.NET

Json.Net是.net framework 使用的比较频繁的Json序列化组件,Json.Net已经支持.net core,最新版本已经到v13版,使用Json.NET类库需要引入的命名空间 using Newtonsoft.Json并需要下载nuget包。使用具体如下.

 //引用using Newtonsoft.Json; //公共的对象TestModel  public class TestModel    {        public string UserName { get; set; }        public string Sex { get; set; }        public string phone { get; set; }    }   //main方法  public static void Main()   {            TestModel model = new TestModel();            model.UserName = "张山";            model.Sex = "男";            model.phone = "135000";              //序列化           var stustrjson = JsonConvert.SerializeObject(model);         //反序列化          var fanstustr2= JsonConvert.DeserializeObject<TestModel>(stustrjson);          string strContent1 = "对象序列化:" + strJson + "\n" +                      "反序列化值:" + models.phone + " " + models.Sex + " " + models.UserName;          Console.WriteLine(strContent1);}

2、System.Text.Json

微软在.NET Core 3.0 提供了一个名为System.Text.Json的全新命名空间,使用时需要引入的命名空间System.Text.Json,相比Json.Net据说性能提高不少。如果是在.NET Core 3.0 以上版本建议使用。具体使用如下

 //引用using System.Text.Json; //公共的对象TestModel  public class TestModel    {        public string UserName { get; set; }        public string Sex { get; set; }        public string phone { get; set; }    }   //main方法  public static void Main()   {            TestModel model = new TestModel();            model.UserName = "张山";            model.Sex = "男";            model.phone = "135000";              //序列化 默认序列化器,仅支持 asnii编码 格式,以提升效率,使用时注意转码            string strJson = JsonSerializer.Serialize(model2);            //反序列化            var models= JsonSerializer.Deserialize<TestModel>(stuStr1);                   string strContent1 = "对象序列化:" + strJson + "\n" +                      "反序列化值:" + models.phone + " " + models.Sex + " " + models.UserName;          Console.WriteLine(strContent1);}

注意:同时使用JSON.NET和 System.Text.Json会存在引用冲突,使用时注意避免。

3、DataContractJsonSerializer

这是.NET Framwork3.5自带的JSON序列化内库,System.Runtime.Serialization.Json可很好的完成JSON的解析,但是使用不是太便利。具体使用如下

 //使用DataContractJsonSerializer方式需要引入的命名空间,using System.Runtime.Serialization.Json; //公共的对象TestModel  public class TestModel    {        public string UserName { get; set; }        public string Sex { get; set; }        public string phone { get; set; }    }   //main方法  public static void Main()   {            TestModel model = new TestModel();            model.UserName = "张山";            model.Sex = "男";            model.phone = "135000";              //使用了JsonHelper类来实现具体方法            //序列化            string strJson = JsonHelper.ObjectToJson(model);            //Json反序列化对象            var models = JsonHelper.JsonToObject<TestModel>(strJson);            string strContent = "对象序列化:" + strJson + "\n" +                                "反序列化值:" + models.phone + " " + models.Sex + " " + models.UserName;          Console.WriteLine(strContent);}
//序列化Helper类public static class JsonHelper //引用1    {        #region 第三种种 DataContractJsonSerializer        //注:可用[IgnoreDataMember] 标记不序列化的属性        //实体中的契约[DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的        //对于其他两种方式不必加,也可以的。        public static string ObjectToJson(object obj)        {            using (MemoryStream stream = new MemoryStream())            {                DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(obj.GetType());                jsonSerialize.WriteObject(stream, obj);                return Encoding.UTF8.GetString(stream.ToArray());            }        }        // 反序列化        public static T JsonToObject<T>(string strJson)        {            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))            {                DataContractJsonSerializer jsonSerialize = new DataContractJsonSerializer(typeof(T));                return (T)jsonSerialize.ReadObject(stream);            }        }        #endregion    }

4、JavaScriptSerializer

这个也是.NET 3.5推出的JSON序列化和反序列化类库,支持3.5以上的.NET Framwork版本,不支持.NET Core以上版本。命名空间:System.Web.Script.Serialization。具体使用如下:

 //使用JavaScriptSerializer方式需要引入的命名空间,System.Web.Script.Serialization; //公共的对象TestModel  public class TestModel    {        public string UserName { get; set; }        public string Sex { get; set; }        public string phone { get; set; }    }   //main方法  public static void Main()   {            TestModel model = new TestModel();            model.UserName = "张山";            model.Sex = "男";            model.phone = "135000";            //使用了JsonHelper类来实现具体方法            //序列化            string strJson = JsonJavaScriptSerializer.ToJSON(model);            //Json反序列化对象            var models = JsonJavaScriptSerializer.FromJSON<TestModel>(strJson);            string strContent = "对象序列化:" + strJson + "\n" +                                "反序列化值:" + models.phone + " " + models.Sex + " " + models.UserName;            Console.WriteLine(strContent);            Console.ReadLine();}
  public static class JsonJavaScriptSerializer    {        /// <summary>        /// 内存对象转换为json字符串        /// </summary>        /// <param name="obj"></param>        /// <returns></returns>        public static string ToJSON(object obj)        {            StringBuilder sb = new StringBuilder();            JavaScriptSerializer json = new JavaScriptSerializer();            json.Serialize(obj, sb);            return sb.ToString();        }        /// <summary>        /// Json字符串转内存对象        /// </summary>        /// <param name="jsonString"></param>        /// <param name="obj"></param>        /// <returns></returns>        public static T FromJSON<T>(string jsonString)        {            JavaScriptSerializer json = new JavaScriptSerializer();            return json.Deserialize<T>(jsonString);        }    }

以上4种方法根据项目情况使用,如果是.net core 3.0以下版本推荐使用JSON.NET,.net core 3.0以上版本使用System.Text.Json。

如果你还有其它转换方式,欢迎留言讨论。