一、利用Web服务中的JavaScriptSerializer 类

System.Web.Script.Serialization空间,位于System.Web.extensions.dll中。

JavaScriptSerializer jss = new JavaScriptSerializer();
Console.WriteLine(jss.MaxJsonLength); //默认接受最大的长度是 2097152 这个是接受JSON字符串的最大长度,超长会有什么后果呢?试下 Person p = new Person(1, "关羽", 21); //序列化
string json = jss.Serialize(p);
Console.WriteLine(json); //输出 {"Id":1,"Name":"关羽","Age":21}`这就是Json格式了 //反序列化:1、Deserialize泛型写法
Person p2 = jss.Deserialize<Person>("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age); //输出 1 关羽 21
//反序列化:2、Deserialize的非泛型写法
Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}", typeof(Person)) as Person; //注意这个方法返回的是object类,因此要强制转换成Person类
Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age); //同样输出 1 关羽 21
//反序列化:3、将Json字符转换为Object类型
object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
Person p4 = jss.ConvertToType<Person>(obj);
Console.WriteLine(p4.Name);
Person p5 = jss.ConvertToType(obj, typeof(Person)) as Person;
Console.WriteLine(p5.Name); public class Person
{
public Person()
{ }
public Person(int id, string name, int age)
{
this.Id = id;
this.Name = name;
this.Age = age;
}
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

二、利用WCF中的JSON类:DataContractJsonSerializer

System.Runtine.Serialization命名空间中,位于System.Runtine,Serialization.dll中。

void Main()
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person));
//最常用的两个方法
    //反序列化
string str = "{\"Id\":1,\"Name\":\"刘备\",\"Age\":\"23\"}";
Person p;
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str))) //构造函数能够接受Stream参数,因此你可以用内存流,文件流等等创建
{
p = serializer.ReadObject(ms) as Person;
}
Console.WriteLine(p.Name); //输出刘备
    //反序列化
    Person p2 = new Person(2, "关羽", 23);
byte[] byteArr;
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, p2);
byteArr = ms.ToArray();
}
Console.WriteLine(Encoding.UTF8.GetString(byteArr)); //输出 {"Age":23,"Id":1,"Name":"关羽"}
} [DataContract] //对于使用DataContractJsonSerializer类而言,该属性是必须的
public class Person
{
public Person(int id, string name, int age)
{
Id = id;
Age = age;
Name = name;
} [DataMember] //对于使用DataContractJsonSerializer类而言,该属性是必须的
public int Id
{
get;
set;
}
[DataMember]
public string Name
{
get;
set;
}
[DataMember]
public int Age
{
get;
set;
}
}

三、转换规则

  1. String,char =>string
  2. DBNull,null=>null,"null"
  3. Boolean=>trur/false
  4. int,Double,...=>Number
  5. DateTime..=>"\/Date(刻度数)\/" ,即用“\/”包含。
      eg:\/Data(13009188803)\/
  6. 枚举数=>整数值 eg:Color.Red=>3
  7. List<T> ,Arrary,ArrayLIst,=>JSON 数组
    eg:new String[]{"2","2","3"}=>["1","2","3"]
  8. Dictionary<TKey,TVlue>,HashTable =>JSON对象
    eg:new Dictionary<int, string> { { 1, "a" }, { 2, "b" }, { 3, "c" } } => {1:"a",2:"b",3:"c"}
  9. 具有公共实例属性或字段的非抽象类 =>JSON对象
    注意:公共只写属性,以及标记[ScriptIgnore]或[IgnoreDataMember]的属性、字段或属性将被忽略。
      eg: {1:"a",2:"b",3:"c"} 好包括”_type“属性。

四、利用Json.Net三方工具

https://www.newtonsoft.com/json

Json.Net(一)介绍:https://www.cnblogs.com/springsnow/p/10605359.html

五、JSON序列化过程中日期的处理

1、在c#后台进行处理:通过正则表示式

System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Student> list = new List<Student>();
list.Add(new Student()
{
age = 10,
date = DateTime.Now,
name = "宋兴柱 是个好孩\"子,这里\"有英文逗号"
}); var str = js.Serialize(list);
str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
{
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)).ToLocalTime();
return dt.ToString("yyyy-MM-dd HH:mm:ss");
});

原本内容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋兴柱  是个好孩\"子,这里\"有英文逗号"}]

显示结果:[{"age":10,"date":"2014-06-30 11:22:15","name":"宋兴柱  是个好孩\"子,这里\"有英文逗号"}]

2、Json.Net中使用IsoDateTimeConverter格式自定义

IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" };
string json = JsonConvert.SerializeObject(jack, dtConverter);

参考:Json.Net高级用法

3、在JS中进行处理:

接收json数据,日期格式为:"\/Date(1414078309687)\/"

var value = "/Date(1414078309687)/";

var da = eval('new ' + value.replace('/', '', 'g'));
//或者
var da = value.replace(/\/Date\((\d+)\)\//gi, '$1'); ////通过正则拿到里面数。g 全局 i不区分大小写 da.toLocaleDateString() //2014/10/23
da.toLocaleTimeString() //下午11:31:49

六、Json.NET 对比 NET Serializers

https://www.newtonsoft.com/json/help/html/JsonNetVsDotNetSerializers.htm

性能对比:

功能对比:

特性 Json.Net DataContractJsonSerializer JavaScriptSerializer
Json 支持 支持 支持
Bson 支持 不支持 不支持
Json Schema 支持 不支持 不支持
.Net 2.0 支持 不支持 不支持
.Net 3.5 支持 支持 支持
.Net 4.0 支持 支持 支持
Silverlight 支持 支持 不支持
Windows Phone 支持 支持 不支持
Windows 8 Metro 支持 支持 不支持
Linq to Json 支持 不支持 不支持
Indented Json(有换行格式的Json) 支持 不支持 不支持
Json和XML转换 支持 不支持 不支持
序列化DataTable和DataSet 支持 不支持 不支持
序列化Entity Framework 支持 不支持 不支持

JSON与对象的序列化与反序列化的更多相关文章

  1. Java对象的序列化与反序列化-Json篇

    说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输.或者在RPC(远程方法调用)时可 ...

  2. 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

    项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...

  3. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化

    度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...

  4. (记录)Jedis存放对象和读取对象--Java序列化与反序列化

    一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...

  5. java中对象的序列化和反序列化

    [对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...

  6. Java对象的序列化与反序列化

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...

  7. Java对象的序列化和反序列化[转]

    Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...

  8. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  9. 对象的序列化与反序列化---IO学习笔记(四)

    对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流.反序列化流 序列化流(ObjectOutputStream) ...

随机推荐

  1. C++中文件流操作

    一.C++中流和流操作符 C++中把数据之间的传输操作称为流,流既可以表示数据从内存传送到某个载体或设备中,即输出流,也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流.C++输入输出除了 ...

  2. Java reflect 反射 1

    1 反射的概述 反射含义:可以获取正在运行的Java对象. JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法; 这种动态 ...

  3. Maven报错:maven-archetype-webapp:RELEASE from any of the configured repositories

    今天学习maven,在控制台下新建maven项目没有问题,但是在STS(eclipse)下创建maven项目老是报错,郁闷死了: ----------------------------------- ...

  4. 深入理解 flex 布局以及计算_Flexbox, Layout

    起因 对于Flex布局,阅读了 大漠老师和其他老师写的文章后,我还是不太理解Flexbox是如何弹性的计算子级项目的大小以及一些其他细节.在大漠老师的帮助下,我去查阅Flexbox 的 W3C 规范文 ...

  5. zabbix与nagios八项重要对比 结论根据业务环境需求决定

    1.web功能: Nagios简单直观,报警与数据都在同一页面,***.红色即为问题项.Nagios web端不要做任何配置. Zabbix监控数据与报警是分开的,查看问题项需要看触发器,查看数据在最 ...

  6. 删除弹出提示框_MVC

    <td> @Ajax.ActionLink(@shared.Delete, "DeleteServicetag", new { id = item.ID }, new ...

  7. C++/CLI 本地字符串和托管字符串之间的转换

    参考: https://docs.microsoft.com/zh-cn/cpp/dotnet/overview-of-marshaling-in-cpp #include "msclr/m ...

  8. Influxdb的存储引擎

    创建Influxdb数据库时,我们可以看到下面选项,每个选项的含义就是本文要描述的: Influxdb内部数据的存储可以使用不同的存储引擎.当前0.8.7版本支持的是LevelDB, RocksDB, ...

  9. Lucene原理之概念

    概念: 数据分两种: 1.结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 2.非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等.(半结构化数据:如XML,HTML等, ...

  10. Angular进阶教程一

    6 AngularJS进阶 6.1数据绑定原理研究 Angular用户都想知道数据绑定是怎么实现的.你可能会看到各种各样的词汇:$watch.$apply.$digest.dirty-checking ...