欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

C#对JSON与对象的序列化与反序列化

时间:2022-06-02 10:04:09|栏目:.NET代码|点击:

一、利用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("{\"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(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;
    }
}

三、转换规则

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

四、利用Json.Net三方工具

https://www.newtonsoft.com/json

Json.Net介绍://www.jb51.net/article/247911.htm

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

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

System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
List list = new List();
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

性能对比:

功能对比:

特性 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 支持 不支持 不支持

上一篇:c#判断网络连接状态

栏    目:.NET代码

下一篇:DropDownList绑定选择数据报错提示异常解决方案

本文标题:C#对JSON与对象的序列化与反序列化

本文地址:http://www.codeinn.net/misctech/203505.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有