【问题标题】:why I cant deserlize json using datacontractserializer when using wrapped format为什么在使用包装格式时我不能使用 datacontractserializer 反序列化 json
【发布时间】:2017-03-31 20:40:09
【问题描述】:

我的 wcf 服务使用包装格式正文样式。当我尝试使用 DataContractJsonSerializer 反序列化它时,没有正确反序列化 json

  SignInResult returnedUser = new SignInResult();
            MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(provider.SignIn(username, password)));
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(SignInResult),"root");
            returnedUser =  serializer.ReadObject(stream) as SignInResult;
            stream.Close();
            return returnedUser;

但我没有得到根据以下 json 填充的对象

{
  "SignInResult": {
    "CreationDate": "/Date(1480598102923+0000)/",
    "Email": "bladsa@as.com",
    "IsApproved": true,
    "IsLockedOut": false,
    "IsOnline": true,
    "IsValidLogin": true,
    "LastActivityDate": "/Date(1490954750307+0100)/",
    "LastLockoutDate": "/Date(-6816268800000+0000)/",
    "LastLoginDate": "/Date(1490954750307+0100)/",
    "LastPasswordChangedDate": "/Date(-2208988800000+0000)/",
    "ProviderName": "LoginProvider",
    "ProviderUserKey": "dcc5f38f-f71e-4d9d-bdb2-58fb60b7a65e",
    "UserName": "schoi"
  }
}

如果我使用裸格式,它确实有效,因此它肯定与包装的消息格式有关。

我知道我可以在 Newsoft json 中做到这一点,但我知道我会被要求使用微软的方式。

【问题讨论】:

    标签: json wcf


    【解决方案1】:

    就这么简单。首先我们创建一个jsondeserilzer 方法,如下所示:

    public static T DataJsonDeserializer<T>(string jsonString)
    {
        var mStrm = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        var jsonSerializer = new DataContractJsonSerializer(typeof(T));
        var objResponse = jsonSerializer.ReadObject(mStrm);
        return (T)objResponse;
    }
    

    然后我们像这样创建一个 json 对象:

    public class SignInResult
    {
        public DateTime CreationDate { get; set; }
        public string Email { get; set; }
        public bool IsApproved { get; set; }
        public bool IsLockedOut { get; set; }
        public bool IsOnline { get; set; }
        public bool IsValidLogin { get; set; }
        public DateTime LastActivityDate { get; set; }
        public DateTime LastLockoutDate { get; set; }
        public DateTime LastLoginDate { get; set; }
        public DateTime LastPasswordChangedDate { get; set; }
        public string ProviderName { get; set; }
        public string ProviderUserKey { get; set; }
        public string UserName { get; set; }
    }
    
    public class RootObject
    {
        public SignInResult SignInResult { get; set; }
    }
    

    最后你可以像这样对任何东西进行反序列化:

        var x = JsonDeserializer<RootObject>(provider.SignIn(username, password)));
    

    【讨论】:

    • 我认为它需要一个像 rootobject 这样的包装器,我知道 root obect 就是这样。我收到一条错误消息,说期待 SignInresult 但得到了根对象。我太沮丧了,无法将两者联系在一起 DOH!
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多