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

2022-05-13 12:14:14

一、利用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>DBNull,null=>null,"null"Boolean=>trur/falseint,Double,...=>NumberDateTime..=>"/Date(刻度数)/" ,即用“/”包含。 
    eg:/Data(13009188803)/
    枚举数=>整数值 eg:Color.Red=>3List ,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>

    性能对比:

    功能对比:

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

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。