亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

JSON.NET 使用技巧

2019-11-17 02:24:37
字體:
來源:轉載
供稿:網友

JSON.NET 使用技巧

1. 序列化相關技巧

通過特性忽略某些屬性

有時候我們會有這樣的需求,我們只需要序列化實體類中的一部分屬性,這時候我們可以通過聲明忽略掉一些我們不需要序列化的屬性,有兩種方式可以使用么達到這個目標:

首先,可以考慮使用JsonIgnore特性修飾不需要進行序列化的屬性,如下所示:

public class EmployeeBean{    public Guid Id { get; set; }    public string Name { get; set; }    public string Email { get; set; }    public decimal Salary { get; set; }    public string Phone { get; set; }    [JsonIgnore]    public DateTime HireDate { get; set; }}

運行程序:

var employeeBean = new EmployeeBean(){    Id = Guid.NewGuid(),    Name = "gyzhao",    Email = "gyzhao@gyzhao.com",    Salary = 10000,    Phone = "13912390987",    HireDate = new DateTime(2012, 2, 1)};    var jsonString = JsonConvert.SerializeObject(employeeBean, Formatting.Indented);//輸出://{//  "Id": "69a406ad-902c-45d3-8ba7-89a09779ed52",//  "Name": "gyzhao",//  "Email": "gyzhao@gyzhao.com",//  "Salary": 10000.0,//  "Phone": "13912390987"//}

如果說你需要序列化的類有很多的屬性,而你是需要使用其中的一小部分,如果使用上面的上面方式就會比較繁瑣(因為需要忽略的屬性太多了),這時候可以考慮使用DataContract特性修飾被序列化的類,使用DataMember特性修飾需要進行序列化的屬性,其他沒有該特性屬性會被自動忽略掉。如下所示:

[DataContract]public class EmployeeBean{    [DataMember]    public Guid Id { get; set; }    [DataMember]    public string Name { get; set; }    [DataMember]    public string Email { get; set; }    [DataMember]    public decimal Salary { get; set; }    public string Phone { get; set; }    public DateTime? HireDate { get; set; }}

運行程序:

var employeeBean = new EmployeeBean(){    Id = Guid.NewGuid(),    Name = "gyzhao",    Email = "gyzhao@gyzhao.com",    Salary = 10000,    Phone = "13912390987",    HireDate = new DateTime(2012, 2, 1)};    var jsonString = JsonConvert.SerializeObject(employeeBean, Formatting.Indented);//輸出://{//  "Id": "69a406ad-902c-45d3-8ba7-89a09779ed52",//  "Name": "gyzhao",//  "Email": "gyzhao@gyzhao.com",//  "Salary": 10000.0//}

DataContract特性和DataMember特性都從屬于: System.Runtime.Serialization命名空間。

動態序列化對象屬性

多謝園友 @夜色、花清淺 的提醒,確實有這樣的場景:更多的我們可能需要的是動態的來確定需要序列化哪些屬性,比如對于EmployeeBean來說:A方法需要序列化 NameId 屬性,而 B方法需要序列化 EmailPhone 屬性,在這種情況下,前面的兩種使用特性的方式并不能很好的適應需求的變化,通過查詢 JSON.NET 的文檔(傳送門:Json.NET Documentation),官方文檔提供了這個API的示例程序,下面是改進的示例:

var employeeBean = new EmployeeBean(){    Id = Guid.NewGuid(),    Name = "gyzhao",    Email = "gyzhao@gyzhao.com",    Salary = 10000,    Phone = "13912390987",    HireDate = new DateTime(2015, 5, 4)};var perperties = new List<string>(){    employeeBean.GetPRopertyName(t => t.Email),    employeeBean.GetPropertyName(t => t.Phone)};var jsonString = JsonConvert.SerializeObject(employeeBean, Formatting.Indented, new JsonSerializerSettings(){    ContractResolver = new JsonDynamicContractResolver(perperties)    });//{//  "Email": "gyzhao@gyzhao.com",//  "Phone": "13912390987"//}Console.WriteLine(jsonString);

下面是定義 JsonDynamicContractResolver 類的定義:

public class JsonDynamicContractResolver : DefaultContractResolver{      private readonly List<string> _propertiesList;     public JsonDynamicContractResolver(IEnumerable<string> propertiesEnumerable)    {        if (propertiesEnumerable != null)        {            _propertiesList = propertiesEnumerable.ToList();        }    }    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)    {        IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);        //只序列化構造器中傳入的包含在字符串中的屬性        if (_propertiesList != null && _propertiesList.Any())        {            properties =            properties.Where(p => _propertiesList.Exists(pString => pString == p.PropertyName)).ToList();        }        return properties;    }}

在 傳入 JsonDynamicContractResolver 構造函數中的指定序列化屬性的集合時,我在這里使用了擴展方法:GetPropertyName ,這個方法通過傳入一個 Lambda 表達式來獲取需要序列化屬性的字符串表示,這里是通過表達式樹來實現的。相對于直接硬編碼屬性名稱的字符串來說,使用表達式樹動態獲取在效率上有所損失(可接受的程度),不過換取的是設計上的靈活。比如:當我們更改屬性名稱時,編譯器可以為我們提供類型安全的保護。而如果硬編碼的話,如果一旦忘記修改,那么運行就會拋出異常,特別是系統中如果有很多地方都是用這種硬編碼方式的話,那么維護起來就是一個噩夢了。下面是該擴展方法的代碼:

public static class Extensions{    /// <summary>    /// 獲取對象實例屬性的字符串表示    /// </summary>    /// <typeparam name="T"></typeparam>    /// <param name="obj"></param>    /// <param name="func"></param>    /// <returns></returns>    public static string GetPropertyName<T>(this T obj, Expression<Func<T, object>> func)    {        var propertyName = string.Empty;        var expression = func.Body as UnaryExpression;        if (expression != null)        {            propertyName = ((MemberExpression) expression.Operand).Member.Name;        }        else        {            var memberExpression = func.Body as MemberExpression;            if (memberExpression != null)            {                propertyName = memberExpression.Member.Name;            }            else            {                var body = func.Body as ParameterExpression;                if (body != null)                {                    propertyName = body.Type.Name;                }            }        }        return propertyName;    }}

序列化對象時循環引用異常的解決辦法

序列化一個對象時,如果該對象有一個集合屬性,改集合的類型就是對象本身的話,默認序列化的方法會報一個循環引用的異常,如果需要序列化,只需聲明下面的屬性即可:

JsonConvert.SerializeObject(result,new JsonSerializerSettings{ReferenceLoopHandling=ReferenceLoopHandling.Serialize})

2. 反序列化相關技巧

2.1 使用匿名類型作為反序列化實體

var jsonString = @"{                    'Id': '69a406ad-902c-45d3-8ba7-89a09779ed52',                    'Name': 'gyzhao',                    'Salary': 10000.0,                    'HireDate': '2012-02-01T00:00:00'                   }";var employee = new                {                    Name = default(string),                    Salary = default(decimal),                    HireDate = default(DateTime),                    Id = default(Guid)                };var employeeBean = JsonConvert.DeserializeAnonymousType(jsonString, employee);

3. 創建JSON

//命令式的創建JSON對象var array = new JArray();var text = new JValue("Manual text");var date = new JValue(DateTime.Now);array.Add(text);array.Add(date);Console.WriteLine(array.ToString());//使用聲明式的語法var rss =    new JObject(        new JProperty("channel", new JObject(            new JProperty("title", "James Nexton-king"),            new JProperty("link", "http://james.newtonking.com"),            new JProperty("description", "James Newton-Kin's blog."),            new JProperty("item", "BB"))));Console.WriteLine(rss.ToString());//通過一個匿名對象創建JSONJObject o = JObject.FromObject(new{    channel = new    {        title = "James Newton-king",        link = "http://james.netwoing.com",        item = new List<string>()        {            "A",            "B",            "C",            "D",            "E"        }    }});Console.WriteLine(o.ToString());

參考&進一步閱讀

http://www.newtonsoft.com/json


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久999| 亚洲国产精品专区久久| 精品国产依人香蕉在线精品| 欧美日韩中文字幕在线视频| 欧美日韩日本国产| 91九色蝌蚪国产| 亚洲国产精品久久久久久| 日韩综合视频在线观看| 欧美一级视频一区二区| 亚洲激情国产精品| 国产美女久久精品| 国产日韩中文字幕| 亚洲欧美日韩精品| 中文字幕亚洲图片| 欧美精品久久久久| 热久久美女精品天天吊色| 91九色视频导航| 欧美一级大片在线观看| 国产精品久久久久久中文字| 日韩视频免费中文字幕| 色一情一乱一区二区| 精品久久久久久| 69av成年福利视频| 国产91精品久久久久| 亚洲欧美国内爽妇网| 午夜精品在线视频| 精品视频在线播放免| 亚洲香蕉成人av网站在线观看| 欧美日韩国内自拍| 亚洲国产精品va在线| 亚洲性视频网址| 成人性生交大片免费看视频直播| 欧美午夜性色大片在线观看| 久久视频在线播放| 中文字幕精品www乱入免费视频| 91在线高清免费观看| 亚洲大胆人体视频| 91亚洲国产成人久久精品网站| 欧美一区亚洲一区| 欧美性猛交xxxx免费看漫画| 欧美中文字幕视频在线观看| 97人人爽人人喊人人模波多| 亚洲专区国产精品| 久久精品国产久精国产思思| 国产精品主播视频| 亚洲xxx大片| 欧美精品免费在线观看| 日韩亚洲欧美成人| 久久精品中文字幕一区| 欧美亚洲成人xxx| 欧美黑人视频一区| 国产色综合天天综合网| 国产综合在线观看视频| 91久久国产精品91久久性色| 亚洲欧洲日产国码av系列天堂| 久久综合久久美利坚合众国| 日韩二区三区在线| 成人久久久久久| 久久久久久高潮国产精品视| 国产精品永久免费观看| 欧美午夜影院在线视频| 久久激情视频免费观看| 538国产精品视频一区二区| 亚洲精品99久久久久中文字幕| 色阁综合伊人av| 国产精品日韩在线播放| 成人在线视频福利| 色综合伊人色综合网| 91亚洲精品久久久久久久久久久久| 久久国产精品久久久久| 亚洲一区二区三区四区视频| 久久久精品欧美| 久久视频精品在线| 欧美一级成年大片在线观看| 91地址最新发布| 亚洲第一福利视频| 国产做受高潮69| 午夜精品久久久久久久99热| 日韩精品在线视频美女| 欧美在线一区二区三区四| 国产精品中文在线| 高清在线视频日韩欧美| 国产免费一区二区三区香蕉精| 欧美最猛性xxxxx免费| 成人免费直播live| 国产色婷婷国产综合在线理论片a| 欧美日本在线视频中文字字幕| 在线视频亚洲欧美| 成人久久久久久久| 91精品国产综合久久久久久久久| 国产亚洲人成网站在线观看| 亚洲二区中文字幕| 日韩美女视频中文字幕| 亚洲自拍偷拍福利| 在线观看日韩av| 亚洲欧美综合精品久久成人| 国产精品入口免费视频一| 久久久www成人免费精品| 日本亚洲欧美三级| 亚洲欧美日本另类| 91探花福利精品国产自产在线| 日韩av中文字幕在线播放| 精品福利在线观看| 国产精品美女免费| 国内精品小视频| 69久久夜色精品国产69| 国产久一一精品| 神马久久桃色视频| 欧美日韩国产精品专区| 亚洲精品www| 日韩成人网免费视频| 亚洲激情视频在线观看| 日韩av在线播放资源| 久久久久久国产免费| 91午夜理伦私人影院| 午夜精品久久久久久久99热浪潮| 亚洲国产精品系列| 欧美在线观看日本一区| 欧美日韩午夜剧场| 精品av在线播放| 伊人久久综合97精品| 97精品在线观看| 午夜欧美大片免费观看| 国产精品高清在线观看| 亚洲男人天天操| 中文欧美在线视频| 亚洲欧美一区二区激情| 97国产精品免费视频| 国产欧美日韩丝袜精品一区| 97激碰免费视频| 日韩一区视频在线| 正在播放国产一区| 国产精品久久久久久久久久三级| 国产婷婷成人久久av免费高清| 久久这里有精品视频| 久久久噜噜噜久噜久久| 亚州欧美日韩中文视频| www.久久色.com| 91亚洲国产精品| 欧美激情在线有限公司| 国产经典一区二区| 黄网站色欧美视频| www亚洲欧美| 欧美激情中文网| 亚洲国内高清视频| 九九精品在线播放| 欧美成人午夜视频| 亚洲一区亚洲二区亚洲三区| 永久免费毛片在线播放不卡| 亚洲a区在线视频| 日韩亚洲欧美中文高清在线| 亚洲免费视频观看| 欧洲成人在线观看| 久久久成人的性感天堂| 亚洲a级在线播放观看| 精品久久香蕉国产线看观看亚洲| 日本精品久久久久影院| 成人在线一区二区| 亚洲一区二区中文| 中文日韩在线视频| 国产中文字幕91| 日韩成人在线电影网| 97欧美精品一区二区三区| 亚洲欧美制服丝袜|