熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

asp.net JSON序列化與反序列化使用

2013-11-13 10:45:59  來源: .NET編程 

  對JSON數據進行序列化和反序列化

  可以使用DataContractJsonSerializer類將類型實例序列化為JSON字符串並將JSON字符串反序列化為類型實例 DataContractJsonSerializer在SystemRuntimeSerializationJson命名空間下NET Framework 包含在SystemServiceModelWebdll中需要添加對其的引用;NET Framework 在SystemRuntimeSerialization中

  方法一引入SystemWebScriptSerialization命名空間使用 JavaScriptSerializer類實現簡單的序列化序列化類Personnel

代碼如下   public class Personnel
{
public int Id { get; set; }
public string Name { get; set; }
}

  執行序列化反序列化

代碼如下  

  protected void Page_Load(object sender EventArgs e)
{
Personnel personnel = new Personnel();
personnelId = ;
personnelName = "小白";

  JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//執行序列化
string r = jsonSerializerSerialize(personnel);

  //執行反序列化
Personnel _Personnel = jsonSerializerDeserialize<Personnel>(r);
}

  

  r輸出結果{"Id":"Name":"小白"}

  可以使用 ScriptIgnore屬性標記不序列化公共屬性或公共字段

代碼如下   public class Personnel
{
[ScriptIgnore]
public int Id { get; set; }
public string Name { get; set; }
}

  r輸出結果{"Name":"小白"}

  方法二引入 SystemRuntimeSerializationJson命名空間使用 DataContractJsonSerializer類實現序列化

  序列化類People

代碼如下  

  

  public class People
{
public int Id { get; set; }
public string Name { get; set; }
}

  執行序列化反序列化

代碼如下  

  protected void Page_Load(object sender EventArgs e)
{
People people = new People();
peopleId = ;
peopleName = "小白";

  
DataContractJsonSerializer json = new DataContractJsonSerializer(peopleGetType());
string szJson = "";
//序列化
using (MemoryStream stream = new MemoryStream())
{
jsonWriteObject(stream people);
szJson = EncodingUTFGetString(streamToArray());
}
//反序列化
using (MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(szJson)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(People));
People _people = (People)serializerReadObject(ms);
}
}

  

  szJson輸出結果{"Id":"Name":"小白"}

  可以使用IgnoreDataMember:指定該成員不是數據協定的一部分且沒有進行序列化DataMember:定義序列化屬性參數使用DataMember屬性標記字段必須使用DataContract標記類 否則DataMember標記不起作用

代碼如下  

  

  [DataContract]
public class People
{
[DataMember(Name = "id")]
public int Id { get; set; }
[IgnoreDataMember]
public string Name { get; set; }
}

  輸出結果: {"id":}

  JSON序列化和反序列化日期時間的處理

  JSON格式不直接支持日期和時間DateTime值值顯示為“/Date(+)/”形式的JSON字符串其中第一個數字(在提 供的示例中為 )是 GMT 時區中自 日午夜以來按正常時間(非夏令時)經過的毫秒數該數字可以是負數以表示之前的時間示例中包括“+”的部分可選它指示該時間屬於Local 類型即它在反序列化時應轉換為本地時區如果沒有該部分則會將時間反序列化為Utc

  修改Person類添加LastLoginTime

代碼如下   public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime LastLoginTime { get; set; }
}
Person p = new Person();
pName = "張三";
pAge = ;
pLastLoginTime = DateTimeNow;
string jsonString = JsonHelperJsonSerializer<Person>(p);

  序列化結果

  {"Age":"LastLoginTime":"/Date(+)/""Name":"張三"}

   在後台使用正則表達式對其替換處理修改JsonHelper

代碼如下  
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemWeb;
using SystemRuntimeSerializationJson;
using SystemIO;
using SystemText;
using SystemTextRegularExpressions;
/// <summary>
/// JSON序列化和反序列化輔助類
/// </summary>
public class JsonHelper
{
/// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<T>(T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
serWriteObject(ms t);
string jsonString = EncodingUTFGetString(msToArray());
msClose();
//替換Json的Date字符串
string p = @"\/Date((d+)+d+)\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
jsonString = regReplace(jsonString matchEvaluator);
return jsonString;
}
/// <summary>
/// JSON反序列化
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
//將"yyyyMMdd HH:mm:ss"格式的字符串轉為"/Date(+)/"格式
string p = @"d{}d{}d{}sd{}:d{}:d{}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = regReplace(jsonString matchEvaluator);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(jsonString));
T obj = (T)serReadObject(ms);
return obj;
}
/// <summary>
/// 將Json序列化的時間由/Date(+)轉為字符串
/// </summary>
private static string ConvertJsonDateToDateString(Match m)
{
string result = stringEmpty;
DateTime dt = new DateTime();
dt = dtAddMilliseconds(longParse(mGroups[]Value));
dt = dtToLocalTime();
result = dtToString("yyyyMMdd HH:mm:ss");
return result;
}
/// <summary>
/// 將時間字符串轉為Json時間
/// </summary>
private static string ConvertDateStringToJsonDate(Match m)
{
string result = stringEmpty;
DateTime dt = DateTimeParse(mGroups[]Value);
dt = dtToUniversalTime();
TimeSpan ts = dt DateTimeParse("");
result = stringFormat("\/Date({}+)\/"tsTotalMilliseconds);
return result;
}
}

  序列化Demo

代碼如下   Person p = new Person();
pName = "張三";
pAge = ;
pLastLoginTime = DateTimeNow;
string jsonString = JsonHelperJsonSerializer<Person>(p);

  運行結果

代碼如下   {"Age":"LastLoginTime":" ::""Name":"張三"}
反序列化Demo
string json = "{"Age":"LastLoginTime":" ::""Name":"張三"}";
p=JsonHelperJsonDeserialize<Person>(json);
From:http://tw.wingwit.com/Article/program/net/201311/14467.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.