要將一個對象序列化,可是如果對象的屬性為null的時候,我們想將屬性為null的都去掉。
在這里我使用Newtonsoft.Json.dll
記錄一下序列化以及反序列化
json字符串轉對象
Model model=JsonConvert.DeserializeObject<Model>(val);
將對象轉化為json格式字符串
string jsonString = JsonConvert.SerializeObject(obj);
那么如何序列化為json時過濾掉NULL呢??
var jsonSetting = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}; var json = JsonConvert.SerializeObject(data, Formatting.Indented, jsonSetting);
直接這樣JsonConvert.SerializeObject(obj);序列化結果
"MemberQuery": { "PhoneNumber": "13222222222", "Name": "test", "MF": "女", "BirthDate": "01/01/2017", "MaritalStatus": null, "Country": null }
過濾掉NULL序列化結果:
"MemberQuery": { "PhoneNumber": "13222222222", "Name": "test", "MF": "女", "BirthDate": "01/01/2017" }
以前需要將一段json字符串轉換為C#對象時,一般都是定義一個與之對應的實體類來接收。這樣做有一個很大的缺點,就是當字符串特別長,屬性特別多,又有嵌套時,手敲這個實體類就非常痛苦。
比如之前做的一個接收百度七天天氣預報的API,層層嵌套,很痛苦。
C# 4.0 之后有了動態類型dynamic。用這個東西配合Json.net可以實現不用定義實體類的json轉dynamic類型對象。
以下示例需要先引用Newtonsoft.Json.dll
public class Person { public int Id { get; set; } public string Name { get; set; } } class Program { static void Main(string[] args) { Person p = new Person(); p.Id = 1; p.Name = "劉備"; //C#對象轉Json string json = JsonConvert.SerializeObject(p); Console.WriteLine(json); //{"Id":1,"Name":"劉備"} //此處模擬在不建實體類的情況下,反轉將json返回dynamic對象 var DynamicObject = JsonConvert.DeserializeObject<dynamic>(json); Console.WriteLine(DynamicObject.Name); //劉備 Console.ReadKey(); } }
以上只是借用了一個實體類來獲得一個簡單的JSON對象。
實際上,可以完全沒有這個Person類。
static void Main(string[] args) { string json = "{\"Id\":1,\"Name\":\"劉備\",\"Age\":\"22\"}"; //此處模擬在不建實體類的情況下,反轉將json返回回dynamic對象 var DynamicObject = JsonConvert.DeserializeObject<dynamic>(json); Console.WriteLine(DynamicObject.Name); //劉備 Console.ReadKey(); }
如果未引用Microsoft.CSharp.dll,關於動態類型,VS可能會報錯。
VS 可以回編譯報錯:找不到編譯動態表達式所需的一個或多個類型。是否缺少引用?