JavaScriptSerializer序列化内部属性成员

时间:2014-11-26 00:58:45

标签: c# asp.net-mvc

我有一个像这样的类库项目......

[DataContract]
public class DomainVerify
{
    [DataMember]
    internal string key { get; set; }
    public string domain { get; set; }
    public string mailbox { get; set; }
}

我将密钥设为内部,因此我的其他项目无法看到此属性。现在的问题是,在我所拥有的同一个项目中," DomainVerify"类,我使用JavaScriptSerialize将我的类序列化为JSON字符串&好像我无法将#34; key"属于"内部"。

var json = new JavaScriptSerializer().Serialize(DomainVerify); // Skips Key property
无论如何都有,所以我可以将这个属性隐藏到其他项目中,但是可以在同一个项目中序列化这个属性吗?

1 个答案:

答案 0 :(得分:1)

我认为你必须使用DataContractJsonSerializer。

以下是MSDN上提供的示例。这个例子是内部属性。

http://msdn.microsoft.com/en-us/library/bb412179(v=vs.110).aspx

我没有尝试使用JavaScriptSerializer但是如果有一些设置允许那么只有它可以序列化内部所以我建议尝试使用DataContractJsonSerialier。

如果这不能解决您的问题,那么请寻找Newton.Json。 http://www.tecsupra.com/serializing-only-some-properties-of-an-object-to-json-using-newtonsoft-json-net/

最后但并非最不重要的是确保您的内部属性具有某些价值。

DataContractJsonSerializer

class Program
    {
        static void Main(string[] args)
        {
            DomainVerify verify = new DomainVerify() { domain = "test", key = "myKey", mailbox = "Newkey" };
            Console.WriteLine(GetJsonString(verify));
            Console.ReadLine();

        }

        public static string GetJsonString(object o)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(o.GetType());
            using (MemoryStream ms = new MemoryStream())
            {
                ser.WriteObject(ms, o);
                string jsonData = Encoding.Default.GetString(ms.ToArray());                
                return jsonData;
            }
        }
    }

    [DataContract]
    public class DomainVerify
    {
        [DataMember]
        internal string key { get; set; }
        [DataMember]
        public string domain { get; set; }
        [DataMember]
        public string mailbox { get; set; }
    }

对于WCF,您必须使用datacontract标记要参与序列化的每个属性。

您必须添加System.ServiceModel和System.Runtime.Serialization程序集。

如果是Json.net(你必须添加包)

public class DomainVerify
    {
        [Newtonsoft.Json.JsonProperty]  // if you don't mark this attribute then as this is internal property it will not serilize.
        internal string key { get; set; }
        [Newtonsoft.Json.JsonProperty] // as this is public property it always include in serilization unless you mark it with JsonIgnore.
        public string domain { get; set; }
        [Newtonsoft.Json.JsonProperty]
        public string mailbox { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DomainVerify verify = new DomainVerify() { domain = "test", key = "myKey", mailbox = "Newkey" };
            Console.WriteLine(GetJsonString(verify));
            Console.ReadLine();            
        }

        public static string GetJsonString(object o)
        {
            return JsonConvert.SerializeObject(o);
        }
     }

我希望以上的事能帮助你。

注意:我仍有一些疑问,如果您从其他项目传递此对象,则该字段可能不包含正确的值或为空,因为它是内部的。