【问题标题】:Cannot Deserialize Enum using DataContractJsonSerializer无法使用 DataContractJsonSerializer 反序列化枚举
【发布时间】:2012-10-02 04:54:59
【问题描述】:

REST 服务返回这个 json 字符串

"{\"UserProfile\":2,\"UserInfo\":0,\"Status\":1,\"Photo\":0,\"Video\":1,\"Comment\":0,\"ProfilePic\":0,\"Friends\":0,\"Tags\":2}"  

并使用以下代码反序列化:

    public static T Deserialize<T>(string json)
    {
        T obj = Activator.CreateInstance<T>();
        MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
        System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());
        obj = (T)serializer.ReadObject(ms);
        ms.Close();
        ms.Dispose();
        return obj;
    }  

Security sec = Deserialize<Security>(jsonresult);  

地点:

[DataContract]
public class Security
{
    [DataMember]
    SecurityType UserProfile { get; set; }

    [DataMember]
    SecurityType UserInfo { get; set; }

    [DataMember]
    SecurityType Status { get; set; }

    [DataMember]
    SecurityType Photo { get; set; }

    [DataMember]
    SecurityType Video { get; set; }

    [DataMember]
    SecurityType Comment { get; set; }

    [DataMember]
    SecurityType ProfilePic { get; set; }

    [DataMember]
    SecurityType Friends { get; set; }

    [DataMember]
    SecurityType Tags { get; set; }
}  

还有枚举:

[DataContract]
public enum SecurityType
{
    [EnumMember]
    Everyone,

    [EnumMember]
    FriendsOf,

    [EnumMember]
    Friends
}  

将jsonstring反序列化后,返回Security类型,所有属性值都等于Everyone(相当于零)。
看着console.log

$.post('@Url.Action("GetSecurityProfile", "Home")', { reload: reload }, function (data) {

    console.log(data);

    $('[data-security-profile] option').eq(data.UserProfile).attr('selected', 'selected');
    $('[data-security-info] option').eq(data.UserInfo).attr('selected', 'selected');
    $('[data-security-status] option').eq(data.Status).attr('selected', 'selected');
    $('[data-security-photos] option').eq(data.Photo).attr('selected', 'selected');
    $('[data-security-videos] option').eq(data.Video).attr('selected', 'selected');
    $('[data-security-comment] option').eq(data.Comment).attr('selected', 'selected');
    $('[data-security-profilepic] option').eq(data.ProfilePic).attr('selected', 'selected');
    $('[data-security-colleagues] option').eq(data.Friends).attr('selected', 'selected');
    $('[data-security-tags] option').eq(data.Tags).attr('selected', 'selected');

});  

返回:object{ }(空值)
我无法弄清楚代码有什么问题。请帮忙。

【问题讨论】:

  • 序列化程序正在寻找名为“0”、“1”和“2”的枚举字段;没有找到它们,它正在使用默认值。恐怕我不确定最好的解决方案是什么。
  • 在C#代码中反序列化,为什么要查看js日志?
  • 您的代码可以很好地反序列化 json 字符串。我认为您未发布的某些代码会导致您的财产价值丢失。我的猜测是问题出在您的 GetSecurityProfile() 方法中。

标签: c# asp.net-mvc json serialization


【解决方案1】:

尝试公开 Security 类的属性:

[DataContract]
public class Security
{
    [DataMember]
    public SecurityType UserProfile { get; set; }

    [DataMember]
    public SecurityType UserInfo { get; set; }

    [DataMember]
    public SecurityType Status { get; set; }

    [DataMember]
    public SecurityType Photo { get; set; }

    [DataMember]
    public SecurityType Video { get; set; }

    [DataMember]
    public SecurityType Comment { get; set; }

    [DataMember]
    public SecurityType ProfilePic { get; set; }

    [DataMember]
    public SecurityType Friends { get; set; }

    [DataMember]
    public SecurityType Tags { get; set; }
}  

【讨论】:

  • 天哪!我真的没有注意到这一点。我觉得我压力过大。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2019-05-31
  • 2015-07-26
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多