Десериализация объекта приводит к нулевым переменным внутри объекта

#c# #json #asp.net-core #serialization #json.net

Вопрос:

Я пытаюсь десериализовать объект в C#, используя платформу NewtonSoft для обработки json. Это мой код.

Краткое Объяснение

По сути, я создаю вызов api для конечной точки входа в систему для аутентификации моего пользователя (это работает), мне нужно извлечь токен носителя из вызова 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().Resu< //Get JSON String

    UserResponseDTO dto = new UserResponseDTO();

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

Теперь моя последняя проверка утверждения состоит в том, чтобы проверить, является ли объект DTO нулевым….его нет, но значения внутри него есть.

Это пользователь, отвечающий на

 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 отображается в переменной jsonString

Код 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. Шаг 1 — покажите нам фактический JSON.

2. THE CORRECT Json String is being returned Существует почти 100% корреляция между этим утверждением и тем фактом, что JSON не соответствует структуре класса. Пожалуйста, поделитесь фактическим JSON.

3. 1000 извинений, я сделал это

4. @TheNotoriousCoder опубликует документ JSON в виде строки . Изображения деревьев свойств не являются JSON и не могут быть десериализованы.

5. На самом деле, сэкономьте свое время. Выбросьте существующие классы, так как они совершенно неверны (как и предполагалось). Перейти к app.quicktype.io . Вставьте в JSON. Используйте классы, которые он генерирует.

Ответ №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);
 

Комментарии:

1. Этот ответ не сработал, я получаю строку json с «rn», я думаю, что это вызывает проблему, обновлю вас завтра.

2. Привет @TheNotoriousCoder, есть какие-нибудь новости? Мой ответ помог вам решить вашу проблему? Если да,не могли бы вы, пожалуйста, принять в качестве ответа? Если нет,не могли бы вы, пожалуйста, продолжить, чтобы сообщить мне об этом? См. раздел: Как принять в качестве ответа . Спасибо.