Json序列化指定輸出字段 忽略屬性

DataContract

服務契約定義了遠程訪問對象和可供調用的方法,數據契約則是服務端和客戶端之間要傳送的自定義數據類型。html

一旦聲明一個類型爲DataContract,那麼該類型就能夠被序列化在服務端和客戶端之間傳送,以下所示。

      [DataContract]

     public class UserInfo

     {

          //….

    }
只有聲明爲DataContract的類型的對象能夠被傳送,且只有成員屬性會被傳遞,成員方法不會被傳遞。WCF對聲明爲DataContract的類型提供更加細節的控制,能夠把一個成員排除在序列化範圍之外,也就是說,客戶端程序不會得到被排除在外的成員的任何信息,包括定義和數據。默認狀況下,全部的成員屬性都被排除在外,所以須要把每個要傳送的成員聲明爲DataMember,以下所示。

    [DataContract]

    public class UserInfo

    {

        [DataMember]

        public string UserName

        {

            get;

            set;

        }

        [DataMember]

        public int Age

        {

            get;

            set;

        }

        [DataMember]

        public string Location

        {

            get;

            set;

        }
        [IgnoreDataMember]
        public string Zodiac

        {

            get;

            set;

        }

}    

上面這段代碼把UserInfo類聲明爲DataContract,將UserName、Age、Location這3個屬性聲明爲DataMember(數據成員)。Zodiac成員沒有被聲明爲DataMember,所以在交換數據時,不會傳輸Zodiac的任何信息。json

聲明爲DataMember的成員也能夠自定義客戶端可見的名稱,例如:spa

[DataMember(Name="Name")]

public string UserName

{

     get;

     set;

}

 

using  in the .NET frameworkSystem.Web.Script.Serialization
public class User {
    public int Id { get; set; }
    public string Name { get; set; }
    [ScriptIgnore]
    public bool IsComplete
    {
        get { return Id > 0 && !string.IsNullOrEmpty(Name); }
    } 
} 

//{ Id: 3, Name: 'Test User' }

 

If you are using Json.Net attribute [JsonIgnore] will simply ignore .net

public class Car
{
  // included in JSON
  public string Model { get; set; }
  public DateTime Year { get; set; }
  public List<string> Features { get; set; }

  // ignored
  [JsonIgnore]
  public DateTime LastModified { get; set; }
}

jsonignore demo:code

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    [JsonObject(MemberSerialization.OptIn)]
    public class User
    {
        [JsonProperty(PropertyName = "ID")]
        public int Unid { get; set; }

        [JsonProperty]
        public string UserName { get; set; }

        [JsonProperty]
        [JsonConverter(typeof(IsoDateTimeConverter))]
        public DateTime CreateTime { get; set; }

        [JsonIgnoreAttribute]
        public string PasssWord { get; set; }

        public string Memo { get; set; }

        [JsonProperty("userName")]
        public string UserName{ set; get; }
    }
}

JsonObjectAttributexml

這個標籤的成員序列化標誌指定成員序列化是opt-in(要序列化的成員必須帶有JsonProperty或DataMember標籤)仍是opt-out(默認全部的都會序列化,但經過JsonIgnoreAttribute標籤能夠忽略序列化。opt-out是json.net默認的)。htm

 

JsonPropertyAttribute對象

容許被序列化的成員自定義名字。這個標籤同時標示出:在成員序列化設置爲opt-in的時候,成員會被序列化。blog

 

JsonIgnoreAttributeip

忽略域或屬性的序列化

 

JsonConverterAttribute

用於指派轉換對象的JsonSerializer。

這個標籤能夠修飾類或類成員。用於修飾類時,經過此標籤指派的JsonConverter會被設置爲序列化類的默認方式。用於修飾屬性或域成員時,被指派的JsonConverter會序列化它們的值。

Or you can use DataContract and DataMember attribute to selectively serialize/deserialize properties/fields.

[DataContract]
public class Computer
{
  // included in JSON
  [DataMember]
  public string Name { get; set; }
  [DataMember]
  public decimal SalePrice { get; set; }

  // ignored
  public string Manufacture { get; set; }
  public int StockCount { get; set; }
  public decimal WholeSalePrice { get; set; }
  public DateTime NextShipmentDate { get; set; }
}

 

將一個類序列化成JSON或XML時,若是某個字段或屬性不想被序列化,則可使用如下Attribute:

一、[Newtonsoft.Json.JsonIgnore]特性:使用Newtonsoft.Json序列化時字段不會被序列化。

二、[System.Web.Script.Serialization.ScriptIgnore]特性:使用JavaScriptSerializer序列化時字段不會被序列化。

三、[System.Xml.Serialization.XmlIgnore]特性:字段不會被序列化成XML。

實例:將用戶信息類序列化成JSON和XML格式,其中電子郵件字段不被序列化。

一、建立用戶信息類 

/// <summary>
/// 用戶信息類
/// </summary>
public class UserInfo
{
    /// <summary>
    /// 名稱
    /// </summary>
    public string Name { get; set; }
 
    /// <summary>
    /// 年齡
    /// </summary>
    public int Age { get; set; }
 
    /// <summary>
    /// 電子郵件
    /// </summary>
    [Newtonsoft.Json.JsonIgnore]
    [System.Web.Script.Serialization.ScriptIgnore]
    [System.Xml.Serialization.XmlIgnore]
    public string Email { get; set; }
}

 

二、實現功能

static void Main(string[] args)
{
    //建立用戶信息
    UserInfo user = new UserInfo();
    user.Name = "張三";
    user.Age = 25;
    user.Email = "zhangsan@qq.com";
 
    //一、使用Newtonsoft轉JSON
    string newtonStr = JsonConvert.SerializeObject(user);
 
    //二、使用JavaScriptSerializer類轉JSON
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string serializedStr = serializer.Serialize(user);
 
    //三、XML序列化
    string xmlStr = XmlSerialize<UserInfo>(user);
 
    System.Console.ReadLine();
}
 
//XML序列化方法
public static string XmlSerialize<T>(T obj)
{
    using (StringWriter sw = new StringWriter())
    {
        Type t = obj.GetType();
        XmlSerializer serializer = new XmlSerializer(obj.GetType());
        serializer.Serialize(sw, obj);
        sw.Close();
        return sw.ToString();
    }
}

執行結果 

一、使用Newtonsoft轉JSON輸出結果:{"Name":"張三","Age":25}

二、使用JavaScriptSerializer類轉JSON輸出結果:{"Name":"張三","Age":25}

三、XML序列化結果:
<?xml version="1.0" encoding="utf-16"?>
<UserInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>張三</Name>
  <Age>25</Age>
</UserInfo>
 
 

 

參考:

https://stackoverflow.com/questions/10169648/how-to-exclude-property-from-json-serialization/10169675#10169675

https://blog.csdn.net/pan_junbiao/article/details/82827978 C#中類的字段或屬性不被序列化成JSON或XML

http://www.javashuo.com/article/p-xeipeazn-dc.html    Json.net 忽略實體某些屬性的序列化

相關文章
相關標籤/搜索