欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#對JSON與對象的序列化與反序列化

 更新時間:2022年05月13日 09:32:14   作者:springsnow  
這篇文章介紹了C#對JSON與對象的序列化與反序列化,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、利用Web服務(wù)中的JavaScriptSerializer 類

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

JavaScriptSerializer jss = new JavaScriptSerializer();
Console.WriteLine(jss.MaxJsonLength);   //默認接受最大的長度是 2097152    這個是接受JSON字符串的最大長度,超長會有什么后果呢?試下

Person p = new Person(1, "關(guān)羽", 21);

//序列化
string json = jss.Serialize(p);
Console.WriteLine(json);    //輸出 {"Id":1,"Name":"關(guān)羽","Age":21}`這就是Json格式了

//反序列化:1、Deserialize泛型寫法
Person p2 = jss.Deserialize("{\"Id\":1,\"Name\":\"關(guān)羽\",\"Age\":21}");
Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age);    //輸出 1 關(guān)羽 21
//反序列化:2、Deserialize的非泛型寫法
Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"關(guān)羽\",\"Age\":21}", typeof(Person)) as Person;  //注意這個方法返回的是object類,因此要強制轉(zhuǎn)換成Person類
Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age);    //同樣輸出 1 關(guān)羽 21
  
//反序列化:3、將Json字符轉(zhuǎn)換為Object類型 
object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"關(guān)羽\",\"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)))     //構(gòu)造函數(shù)能夠接受Stream參數(shù),因此你可以用內(nèi)存流,文件流等等創(chuàng)建
    {
        p = serializer.ReadObject(ms) as Person;
    }
    Console.WriteLine(p.Name);      //輸出劉備

    //反序列化
    Person p2 = new Person(2, "關(guān)羽", 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":"關(guān)羽"}
}

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

三、轉(zhuǎn)換規(guī)則

  • String,char =>string
  • DBNull,null=>null,"null"
  • Boolean=>trur/false
  • int,Double,...=>Number
  • DateTime..=>"\/Date(刻度數(shù))\/" ,即用“\/”包含。 
    eg:\/Data(13009188803)\/
  • 枚舉數(shù)=>整數(shù)值 eg:Color.Red=>3
  • List ,Arrary,ArrayLIst,=>JSON 數(shù)組 
    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]的屬性、字段或?qū)傩詫⒈缓雎浴?nbsp;
    eg: {1:"a",2:"b",3:"c"} 好包括”_type“屬性。

四、利用Json.Net三方工具

https://www.newtonsoft.com/json

Json.Net介紹://www.dbjr.com.cn/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");
});

原本內(nèi)容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋興柱 是個好孩\"子,這里\"有英文逗號"}] 
顯示結(jié)果:[{"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數(shù)據(jù),日期格式為:"\/Date(1414078309687)\/"

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

var da = eval('new ' + value.replace('/', '', 'g'));
//或者
var da = value.replace(/\/Date\((\d+)\)\//gi, '$1');   ////通過正則拿到里面數(shù)。g 全局 i不區(qū)分大小寫

da.toLocaleDateString()  //2014/10/23
da.toLocaleTimeString()  //下午11:31:49

六、Json.NET 對比 NET Serializers

性能對比:

功能對比:

特性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轉(zhuǎn)換支持不支持不支持
序列化DataTable和DataSet支持不支持不支持
序列化Entity Framework支持不支持不支持

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#中DataGridView的樣式

    C#中DataGridView的樣式

    這篇文章主要介紹了C#中DataGridView的樣式設(shè)置方法,包括交替行顏色、單元格內(nèi)容有效性檢查、單元格的選擇模式等,需要的朋友可以參考下
    2015-02-02
  • 在Winform動態(tài)啟動、控制臺命令行的方法

    在Winform動態(tài)啟動、控制臺命令行的方法

    winForm 程序輸出類型為 windows 程序(不是命令行程序)在運行時想輸入一些信息編譯開發(fā)調(diào)試,如何實現(xiàn)這一功能
    2013-02-02
  • C#設(shè)置右鍵菜單的方法

    C#設(shè)置右鍵菜單的方法

    這篇文章主要介紹了C#設(shè)置右鍵菜單的方法,實例分析了C#設(shè)置右鍵菜單的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 將Qt項目升級到Qt6吐血經(jīng)驗總結(jié)

    將Qt項目升級到Qt6吐血經(jīng)驗總結(jié)

    很多朋友向小編反饋將Qt項目升級到Qt6頻繁出錯,該如何處理呢,今天小編給大家?guī)砹藢t項目升級到Qt6吐血經(jīng)驗總結(jié),感興趣的朋友一起看看吧
    2021-07-07
  • C#實現(xiàn)ini文件讀寫操作

    C#實現(xiàn)ini文件讀寫操作

    這篇文章主要為大家詳細介紹了C#實現(xiàn)ini文件的讀寫操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類的方法總結(jié)

    C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類的方法總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于C#中如何將MongoDB->RunCommand結(jié)果映射到業(yè)務(wù)類的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2018-04-04
  • C#筆試題之同線程Lock語句遞歸不會死鎖

    C#筆試題之同線程Lock語句遞歸不會死鎖

    這篇文章主要介紹了C$ 筆試題之同線程Lock語句遞歸不會死鎖,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C# 獲得本地通用網(wǎng)卡信息的示例代碼

    C# 獲得本地通用網(wǎng)卡信息的示例代碼

    這篇文章主要介紹了C# 獲得本地通用網(wǎng)卡信息的示例代碼,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-08-08
  • C#利用OpenCvSharp實現(xiàn)玉米粒計數(shù)

    C#利用OpenCvSharp實現(xiàn)玉米粒計數(shù)

    這篇文章主要為大家詳細介紹了C#如何結(jié)合OpenCVSharp4實現(xiàn)玉米粒計數(shù),文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價值,需要的小伙伴可以參考下
    2023-11-11
  • C# 如何實現(xiàn)一個帶通知的List<T>

    C# 如何實現(xiàn)一個帶通知的List<T>

    這篇文章主要介紹了C# 如何實現(xiàn)一個帶通知的List<T>,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02

最新評論