c# json 序列化如何去掉null值


要將一個對象序列化,可是如果對象的屬性為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 可以回編譯報錯:找不到編譯動態表達式所需的一個或多個類型。是否缺少引用?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM