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 = ;
stream.Read(dataBytes, , (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
{
男=,
女=
}
[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("笨男孩",,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

C# 对象与JSON字符串互相转换的三种方式的更多相关文章

  1. JSON字符串互相转换的三种方式和性能比较

    C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ...

  2. Java实现JSONObject对象与Json字符串互相转换

    Java实现JSONObject对象与Json字符串互相转换 JSONObject 转 JSON 字符串 Java代码: JSONObject jsonObject = new JSONObject( ...

  3. Java对象与Json字符串的转换

    Java对象与Json字符串的转换 JSON是一种轻量级的数据交换格式,常用于前后端的数据交流 后端 : 前端 Java对象 > JsonString Java对象 < jsonStrin ...

  4. Javascript中Json对象与Json字符串互相转换方法汇总(4种转换方式)

    1.Json对象转Json字符串 JSON.stringify(obj); 2.Json字符串传Json对象 JSON.parse(str);//第一种 $.parseJSON(str);//第二种, ...

  5. java 多线程:Callable接口;FutureTask类实现对象【Thread、Runnable、Callable三种方式实现多线程的区别】

    Callable接口介绍: Java5开始,Java提供了Callable接口,像是Runnable接口的增强版,Callable接口提供了一个 call()方法可以作为线执行体. call()方法比 ...

  6. Json序列化与反序列化(对象与Json字符串的转换)--C#

    public class JsonHelper { #region Json序列化与反序列化 /// <summary> /// 将json转化为对象 /// (需要提前构造好结构一致的M ...

  7. C#将集合和Json格式互相转换的几种方式

    1.使用微软自带的System.Web.Extensions.dll转换,该DLL文件一般存在于如下路径:c:\Program Files\Reference Assemblies\Microsoft ...

  8. 转换String三种方式比较:toString()、String.valueOf()、(String)

    简单介绍: 1.toString,需要保证调用这个方法的类.方法.变量不为null,否则会报空指针. 2.String.valueOf.这个方法在使用的时候是有些特殊的.一般情况下,如果是确定类型的n ...

  9. .NetCore自定义WebAPI返回Json的格式大小写的三种方式

    .NetCore的Controller/WebAPI可以帮我们将返回结果自动转换为Json格式给前台,而且可以自由设定格式(大写.小写.首字母大写等),我总结了三种方法,对应三种灵活度,供大家参考 ( ...

随机推荐

  1. OpenGL初学:安装配置与第一个程序

    OpenGL初学:安装配置与第一个程序 2014年10月12日 12:37:03 process-z 阅读数:12413 标签: opengl安装教程 更多 个人分类: OpenGL   计算机图形学 ...

  2. odoo 11导入外部数据过程记录

    在开发过程中,遇见需要将SQL Server中的数据转移到Pg数据库的情况,那么如何做才能解决这一问题呢? 1.自己写代码,将数据从SQL Server到PG. 2.利用odoo自带的导入功能导入. ...

  3. [python]python 遍历一个list 的小例子:

    [python]python 遍历一个list 的小例子: mlist=["aaa","bbb","ccc"]for ss in enume ...

  4. Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    转自https://www.cnblogs.com/liujinggang/p/10549095.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件 ...

  5. (9)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- JWT算法

    一. JWT 简介 内部 Restful 接口可以“我家大门常打开”,但是如果要给 app 等使用的接口,则需要做权限校验,不能谁都随便调用. Restful 接口不是 web 网站,App 中很难直 ...

  6. MongoDB日常运维操作命令小结

    总所周知,MongoDB是一个NoSQL非数据库系统,即一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中可以存储一组由列标识的记录,列是可以自由定义的, ...

  7. 状态模式-State-订单状态

    JAVA设计模式-状态模式-State-订单状态 21. State(状态)     意图: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 解释: 比如说对订单的提交,第一 ...

  8. 第三周作业————————word count

    #include <stdio.h> void main() { FILE *fp; , str, word, pu, ch; int g; str = ; word = ; pu = ; ...

  9. Linux内核设计与实现 第四章

    1. 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程). 这个管理程序就是调度程序,功能: 决定哪些进 ...

  10. Python学习笔记(一)——初学Python

    1.Python环境配置 本人配置Python2.7及Python3.6版本 将Python3.6环境配置在线,因此默认为Python3.6版本 Python2.7及Python3.6共存 2.简单操 ...