#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 в соответствии с запросом
"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, есть какие-нибудь новости? Мой ответ помог вам решить вашу проблему? Если да,не могли бы вы, пожалуйста, принять в качестве ответа? Если нет,не могли бы вы, пожалуйста, продолжить, чтобы сообщить мне об этом? См. раздел: Как принять в качестве ответа . Спасибо.