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

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

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。

  关于内存对象和JSON字符串的相互转换,在实际项目中应比较广泛,经过一番搜索,找到如下三种方法来解决此问题

分别是使用 Newtonsoft.Json.dll、DataContractJsonSerializer、 JavaScriptSerializer。 

方法一: Newtonsoft.Json.dll 

Newtonsoft.Json.dll在.net2.0之后的版本可以支持 我的版本.net framework4.0

添加Newtonsoft.json的引用

对象与json字符串转换类设计

class JsonNewtonsoft
    {
        /// <summary>
        /// 把对象转换为JSON字符串
        /// </summary>
        /// <param name="o">对象</param>
        /// <returns>JSON字符串</returns>
        public static string ToJSON(this object o)
        {
            if (o == null)
            {
                return null;
            }
            return JsonConvert.SerializeObject(o);
        }
        /// <summary>
        /// 把Json文本转为实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="input"></param>
        /// <returns></returns>
        public static T FromJSON<T>(this string input)
        {
            try
            {
                return JsonConvert.DeserializeObject<T>(input);
            }
            catch (Exception ex)
            {
                return default(T);
            }
        }
    }

方法二:DataContractJsonSerializer

 使用这种 需要引用 System.Runtime.Serialization.dll

类设计

class JsonDataContractJsonSerializer
    {
        /// <summary>
        /// 内存对象转换为json字符串
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ObjectToJson(object obj)
        {
           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);
           return Encoding.UTF8.GetString(dataBytes);
        }
       /// <summary>
       /// Json字符串转内存对象
       /// </summary>
       /// <param name="jsonString"></param>
       /// <param name="obj"></param>
       /// <returns></returns>
        public static object JsonToObject(string jsonString, object obj)
        {
           DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
           MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
           return serializer.ReadObject(mStream);
        }
    }

方法三:JavaScriptSerializer

需要引用:System.Web.Extensions.dll

类设计

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);
        }

    }

程序测试:

新建一个测试对象类Student.cs

public enum Sex
    {
        男=0,
        女=1
    }
    [Serializable()]
    class Student
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _age;

        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private Sex _sex = Sex.男;

        public Sex Sex
        {
            get { return _sex; }
            set { _sex = value; }
        }
        public Student()
        { }
        public Student(string name,int age,Sex sex)
        {
            this._name = name;
            this._age = age;
            this._sex = sex;
        }
    }

测试程序

static void Main(string[] args)
        {
            Student st = new Student("笨男孩",22,Sex.男);

            Console.WriteLine("============方法一============================================");
            //方法一

            Console.WriteLine("方法一对象转Json字符串");
            string jsonStr = JsonNewtonsoft.ToJSON(st);
            Console.WriteLine(jsonStr);
            Console.WriteLine("方法一Json字符串转对象");
            Student stobj = (Student)JsonNewtonsoft.FromJSON<Student>(jsonStr);
            Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}",stobj.Name,stobj.Age,stobj.Sex);


            Console.WriteLine("============方法二============================================");
            //方法二
            Console.WriteLine("方法二对象转Json字符串");
            string jsonStr2 = JsonDataContractJsonSerializer.ToJSON(st);
            Console.WriteLine(jsonStr2);
            Console.WriteLine("方法二Json字符串转对象");
            Student stobj2 = (Student)JsonDataContractJsonSerializer.FromJSON(jsonStr2, st);
            Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}", stobj2.Name, stobj2.Age, stobj2.Sex);


            Console.WriteLine("============方法三============================================");
            //方法二
            Console.WriteLine("方法三对象转Json字符串");
            string jsonStr3 = JsonJavaScriptSerializer.ToJSON(st);
            Console.WriteLine(jsonStr3);
            Console.WriteLine("方法三Json字符串转对象");
            Student stobj3 = (Student)JsonJavaScriptSerializer.FromJSON<Student>(jsonStr3);
            Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}", stobj3.Name, stobj3.Age, stobj3.Sex);

            Console.ReadKey();
        }

程序运行结果:

运行结果:

 程序工程源文件下载

功能对比:

 

性能对比:

综上所述,一般采用Json.NET方法一比较好!

参考:

JavaScriptSerializer 类介绍 https://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx

DataContractJsonSerializer类介绍 https://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.json.datacontractjsonserializer(v=vs.110).aspx

https://blog.csdn.net/testcs_dn/article/details/78150046?locationNum=6&fps=1

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值