【问题标题】:Deserializing object leads to null variables inside object反序列化对象导致对象内部的空变量
【发布时间】:2021-06-07 05:59:33
【问题描述】:

我正在尝试使用 NewtonSoft 框架来反序列化 C# 中的对象来处理 json。这是我的代码。

简要说明

本质上,我正在创建对登录端点的 api 调用以验证我的用户(这可行),我需要从返回 UserResponseDTO 的 api 调用中提取承载令牌,此 DTO 包含我需要访问的 AuthToken 属性,以通过我的测试用例。

现在这是我的测试用例的代码。

[Fact]
public async void SuccessfulGetUserDetails()
{
    //Arrange
    //Arrange
    var content = JsonConvert.SerializeObject(success); //Prepare payload
    var buffer = System.Text.Encoding.UTF8.GetBytes(content);
    var byteContent = new ByteArrayContent(buffer);
    byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); //Set type to Json

    //Act
    var result = await _client.PostAsync("http://localhost:5000/api/Security/login", byteContent); //Send Request
    var jsonstring = result.Content.ReadAsStringAsync().Result; //Get JSON String

    UserResponseDTO dto = new UserResponseDTO();

    dto = JsonConvert.DeserializeObject<UserResponseDTO>(jsonstring); //Deserialize
    Assert.Equal(dto,null);
}

现在我最后一次 Assert 检查是检查 DTO 对象是否为空......它不是,但它里面的值是。

这是 UserResponseDTO

public class UserResponseDTO
{
    public int UserId { get; set; }

    public string AuthToken { get; set; }
    public string UserName { get; set; }
    public string FullName { get; set; }
    public string Unit { get; set; }
    public string IsActive { get; set; }
    public string Mobile { get; set; }
    
    public string Email { get; set; }
    public List<UserRole> UserRole { get; set; }
    public List<Menus> Menus { get; set;}
}

public class UserRole
{
    public Role Role { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public int ApplicationId { get; set; }
    public string RoleDescription { get; set; }
    public virtual List<RolePermission> RolePermission { get; set; }
    public List<RoleMenu> RoleMenu { get; set; }
}

public class RoleMenu
{
    public int RoleMenuId { get; set; }

    public bool IsDefault { get; set; }
    public virtual Menu Menu { get; set; }
}

public class RolePermission
{
    public int RolePermissionId { get; set; }

    public Permission Permission { get; set; }
}

public class Permission
{
    public int PermissionId { get; set; }
    public string Name { get; set; }
}

public class Menu
{
    public int MenuId { get; set; }
    public string Urlprefix { get; set; }
    public string Url { get; set; }
    public string Description { get; set; }
    public bool IsParent { get; set; }
    public bool IsActive { get; set; }
    public int? ParentMenu { get; set; }
    public string HtmlBody { get; set; }

    public string CssClass { get; set; }
}

public class Menus
{
    public bool isExternal { get; set; }
    public string cssClass { get; set; }
    public string routeLink { get; set; }
    public string menuText { get; set; }
    public List<SubMenuItems> subMenuItems { get; set; } = new List<SubMenuItems>();
}

public class SubMenuItems
{
    public string routeLink { get; set; }
    public string menuText { get; set; }
    public string cssClass { get; set; }
}

最后一点,我注意到了

正确的 Json 字符串被返回,但是它没有被正确地反序列化到 UserResponseDTO 对象中。而且DTO里面的值都是空的。

我可以做些什么来解决这个问题?

他是JSON字符串中返回的JSON

请求的 JSON 代码

 "loginResponse": "Authenticated",
"userDetails": {
    "userId": 3,
    "authToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImFkbWluIiwibmJmIjoxNjIzMDM2OTkxLCJleHAiOjE2MjMwNDA1OTEsImlhdCI6MTYyMzAzNjk5MX0.wwIJ93syFnpcvjtw_Sj1s4uCtYPUtoROmwF3jkDZWo0",
    "userName": "admin",
    "fullName": "REDACTED",
    "unit": null,
    "isActive": "1",
    "mobile": "+REDACTED",
    "email": "REDACTED",
    "userRole": [
        {
            "role": {
                "roleId": 1,
                "applicationId": 1,
                "roleDescription": "Administrator",
                "rolePermission": [
                    {
                        "rolePermissionId": 0,
                        "permission": {
                            "permissionId": 1,
                            "name": "CanApprove"
                        }
                    },
                    {
                        "rolePermissionId": 0,
                        "permission": {
                            "permissionId": 2,
                            "name": "CanReject"
                        }
                    },
                    {
                        "rolePermissionId": 0,
                        "permission": {
                            "permissionId": 3,
                            "name": "CanReview"
                        }
                    },
                    {
                        "rolePermissionId": 0,
                        "permission": {
                            "permissionId": 4,
                            "name": "CanDownload"
                        }
                    }
                ],
                "roleMenu": [
                    {
                        "roleMenuId": 1,
                        "isDefault": true,
                        "menu": {
                            "menuId": 1,
                            "urlprefix": "UI",
                            "url": "worklist",
                            "description": "Menu",
                            "isParent": true,
                            "isActive": true,
                            "parentMenu": null,
                            "htmlBody": "<li><a href=\"URL\"><i class=\"fa fa-cog\"></i><span class=\"nav-label\">HEADING</span></a></li>",
                            "cssClass": "receipt"
                        }
                    },
                    {
                        "roleMenuId": 2,
                        "isDefault": false,
                        "menu": {
                            "menuId": 2,
                            "urlprefix": "UI",
                            "url": "reports",
                            "description": "Link 1",
                            "isParent": false,
                            "isActive": true,
                            "parentMenu": 1,
                            "htmlBody": "<li><a href=\"URL\"><i class=\"fa fa-plug\"></i><span class=\"nav-label\">HEADING</span></a></li>",
                            "cssClass": "fact_check"
                        }
                    },
                    {
                        "roleMenuId": 3,
                        "isDefault": false,
                        "menu": {
                            "menuId": 3,
                            "urlprefix": "UI",
                            "url": "generatefile",
                            "description": "Link 2",
                            "isParent": false,
                            "isActive": true,
                            "parentMenu": 1,
                            "htmlBody": "<li><a href=\"URL\">HEADING</a></li>",
                            "cssClass": "file_present"
                        }
                    },
                    {
                        "roleMenuId": 9,
                        "isDefault": false,
                        "menu": {
                            "menuId": 4,
                            "urlprefix": "UI",
                            "url": "globalsearch",
                            "description": "Global Search",
                            "isParent": true,
                            "isActive": true,
                            "parentMenu": null,
                            "htmlBody": "<li><a href=\"URL\">HEADING</a></li>",
                            "cssClass": "search"
                        }
                    }
                ]
            }
        }
    ],
    "menus": [
        {
            "isExternal": false,
            "cssClass": "receipt",
            "routeLink": "worklist",
            "menuText": "Menu",
            "subMenuItems": [
                {
                    "routeLink": "reports",
                    "menuText": "Link 1",
                    "cssClass": "fact_check"
                },
                {
                    "routeLink": "generatefile",
                    "menuText": "Link 2",
                    "cssClass": "file_present"
                }
            ]
        },
        {
            "isExternal": false,
            "cssClass": "search",
            "routeLink": "globalsearch",
            "menuText": "Global Search",
            "subMenuItems": []
        }
    ]
}

}

【问题讨论】:

  • 第 1 步 - 向我们展示实际的 JSON。
  • THE CORRECT Json String is being returned 该语句与 JSON 与类结构不匹配的事实几乎 100% 相关。请分享实际的 JSON。
  • 1000 道歉我已经这样做了
  • @TheNotoriousCoder 将 JSON 文档作为 字符串 发布。属性树的图像不是 JSON,无法反序列化。
  • 事实上,节省您的时间。扔掉你现有的课程,因为它们是完全错误的(正如怀疑的那样)。转到app.quicktype.io。粘贴 JSON。使用它生成的类。

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


【解决方案1】:

您的 json 与 UserResponseDTO 不匹配,您需要添加匹配的模型,例如:

public class ResponseModel
{
    public string LoginResponse { get; set; }
    public UserResponseDTO UserDetails { get; set; }
}

如果不想添加响应模型,需要修改json字符串为userDetails

//1. get the json string
    string json = System.IO.File.ReadAllText("test.json");
//2. convert to JObject
    var model = JObject.Parse(json);
//3. get userDetails json string
    string jsonstring = model["userDetails"].ToString();

    UserResponseDTO dto = new UserResponseDTO();
    dto = JsonConvert.DeserializeObject<UserResponseDTO>(jsonstring);

【讨论】:

  • 这个答案不起作用,我得到带有“\r\n”的json字符串,我认为这会导致问题,明天会更新你。
  • 嗨@TheNotoriousCoder,有什么更新吗?我的回答是否帮助您解决了您的问题?如果可以,请您接受作为答案吗?如果没有,请您跟进让我知道吗?参考:How to accept as answer。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2013-10-06
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多