开发者社区> 问答> 正文

为什么在使用包装格式时无法使用datacontractserializer反序列化json

我的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中执行此操作,但我知道会被要求使用Microsoft的方式。

展开
收起
游客ufivfoddcd53c 2020-01-04 10:55:27 996 0
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)));
    
    2020-01-04 10:56:07
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载