【问题标题】:Unable to serialize object using Javasciptserializer无法使用 Javasciptserializer 序列化对象
【发布时间】:2014-06-10 17:27:40
【问题描述】:

我正在尝试将一个对象序列化为 JSON 字符串,如下所示:

new JavaScriptSerializer().Serialize(person)

这里,person 是具有许多属性的对象,例如姓名、地址、城市、州等,但我已将类修饰为如下所示,以便它只序列化姓名和地址。

using System;
using System.Runtime.Serialization;

namespace DataAccess.Models
{
    [Serializable]
    [DataContract]
    public class Person
    {        
    public string Id { get; set; }

    [DataMember(Name = "full-name")]
    public string Name { get; set; }

    [DataMember(Name = "address")]
    public string Address { get; set; }

    public string City { get; set; }

    public string State { get; set; }

    public string Zip { get; set; }

    }
}

但是当我运行程序时,new JavaScriptSerializer().Serialize(person) 给了我包含所有数据的 JSON,包括 Id、City、State、Zip。

为什么不给我全名和地址?似乎它完全忽略了这些 DataMember 属性。

当我使用 Newtonsoft 的 JsonConvert.SerializeObject(person) 时,一切正常,它只序列化名称和地址,但 JavascriptSerializer 提供所有数据。

谁能告诉我可能是什么问题?

【问题讨论】:

    标签: asp.net-mvc serialization javascriptserializer


    【解决方案1】:

    考虑在您不想被序列化的那些属性上使用[ScriptIgnore()] 属性。

    http://msdn.microsoft.com/en-us/library/system.web.script.serialization.scriptignoreattribute(v=vs.100).aspx

    有关 JavaScriptSerializer 如何处理不同类型的详细列表,请参见此处:http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx

    编辑:
    请注意,JavascriptSerializer 不知道 DataMember 属性,因此 JavascriptSerializer 不会使用它们(JSON.net 将使用它们,但 JSON.Net 也为此定义了自己的构造:[JsonIgnore()][JsonObject] 和许多其他属性支持自定义命名)。为此,请尝试在 System.Runtime.Serialization.Json 命名空间中使用 DataContractJsonSerializer,但有一些缺点。

    有关更多信息,请参阅此问题和答案:

    JavaScriptSerializer.Deserialize - how to change field names

    【讨论】:

    • 但即使没有 ScriptIgnore,它也会给我 name 属性,其中 Name 作为 Json 中的字符串,而不是全名作为键。这意味着它根本无法识别数据成员。
    • ScriptIgnore 没有帮助,因为我提到它只忽略这些属性,但我仍然将名称和地址作为 Json 中的键,因为它应该是 JSON 中的小写全名和地址键表示由于某种原因,JavascriptSerializer 忽略了序列化。
    • 是的,我相信对我的答案的编辑和链接的 SO 问题/答案解释了为什么 JavaScriptSerializer 会错过那些 DataMember 属性并导致序列化程序只使用原始属性名称。
    • 你是在建议我使用 JSON.net 吗?正如我所提到的,我尝试了 newtonsoft 并且效果很好。所以,如果我必须使用 3rd 方,我可能会坚持使用 newtonsoft。 Json.net 是第三方吗?
    • JSON.NET (Newtonsoft) 是第三方,但具有广泛的采用和社区支持。您还可以使用 DataContractJsonSerializer(.NET 框架的一部分,而不是第三方)而不是 JavascriptSerializer,它将能够读取您的属性以正确序列化您的数据。
    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 2020-11-03
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多