ورود

View Full Version : چرا JsonConvert مقدار Property را تغییر میده؟



mmbguide
جمعه 07 اردیبهشت 1403, 17:05 عصر
سلام خدمت دوستان

یک مقدار رشته ای بافرمت Json بصورت زیر دارم:


{
"value": {},
"hasValue": false,
"isSuccess": true,
"isFail": false,
"messages": [],
"hasMessage": false
}


با استفاده از دستور زیر مقدار برگشتی را به مدل مورد نظر تبدیل می کنم:


JsonConvert.DeserializeObject<Shared.ApiResponse<MediatR.Unit>>(content);


ولی نتیجه چیزدیگه ای شده و مقدار isSuccess شده false و مقدرا isFail شده true:
155668

علت این مغایرت چیه؟ ممنون میشم اگر راهنمایی کنید. تشکر

fakhravari
شنبه 08 اردیبهشت 1403, 08:12 صبح
تنظیمات حروف اول کوچک یا بزرگ شاید تاثیر داشته باشد. این مورد میشه در Program.cs تنظیم کرد

https://json2csharp.com/

mmbguide
شنبه 08 اردیبهشت 1403, 14:48 عصر
کدهای کلاس ApiResponse بصورت زیر است:


public class ApiResponse<T>
{
public ApiResponse()
{
_messages = new List<ApiResponseMessage>();
}


private T? _value;
public T? Value
{
get { return _value; }
set
{
_value = value;
HasValue = !(value is null);
IsSuccess = true;
}
}
public bool HasValue { get; set; }


private bool _isSuccess;
public bool IsSuccess
{
get { return _isSuccess; }
set
{
_isSuccess = true;
_isFail = false;
}
}


private bool _isFail;
public bool IsFail
{
get { return _isFail; }
set
{
_isFail = true;
_isSuccess = false;
}
}


private IList<ApiResponseMessage>? _messages;
public IList<ApiResponseMessage> Messages
{
get { return _messages; }
}
public bool HasMessage { get; set; }




#region Messages


public void AddErrorMessage(Abstractions.Exceptions.CaspianExc eption caspianException)
{
_messages?.Add(new ApiResponseMessage
{
Type = nameof(ApiResponseMessageEnum.Error),
Message = caspianException.Message,
});


HasMessage = true;
IsFail = true;
}


public void AddWarningMessage(Abstractions.Exceptions.CaspianE xception caspianException)
{
_messages?.Add(new ApiResponseMessage
{
Type = nameof(ApiResponseMessageEnum.Warning),
Message = caspianException.Message,
});


HasMessage = true;
}




public void AddDangerMessage(Abstractions.Exceptions.CaspianEx ception caspianException)
{
_messages?.Add(new ApiResponseMessage
{
Type = nameof(ApiResponseMessageEnum.Danger),
Message = caspianException.Message,
});


HasMessage = true;
}




public void AddInformationMessage(Abstractions.Exceptions.Casp ianException caspianException)
{
_messages?.Add(new ApiResponseMessage
{
Type = nameof(ApiResponseMessageEnum.Information),
Message = caspianException.Message,
});


HasMessage = true;
}




public void ClearMessages()
{
_messages?.Clear();
HasMessage = false;
}




#endregion




public class ApiResponseMessage
{
public string Type { get; set; } = string.Empty;
public string Message { get; set; } = string.Empty;
}


public enum ApiResponseMessageEnum
{
Error,
Warning,
Danger,
Information
}
}

mmbguide
شنبه 08 اردیبهشت 1403, 14:50 عصر
آنچه که از پاسخ در StackOverflow متوجه شدم Setterها ایراد داشتند. در نتیجه نسخه نهایی کلاس بصورت زیر شد:


public class ApiResponse<T>
{
public ApiResponse()
{
_messages = new List<ApiResponseMessage>();
}


private T? _value;
public T? Value
{
get { return _value; }
set
{
_value = value;
HasValue = !(value is null);
IsSuccess = true;
}
}


public bool HasValue { get; set; }


private bool _isSuccess;
public bool IsSuccess
{
get { return _isSuccess; }
set
{
_isSuccess = value;


if (value)
HasError = false;
}
}


private bool _hasError;
public bool HasError
{
get { return _hasError; }
set
{
_hasError = value;


if (value)
IsSuccess = false;
}
}


private IList<ApiResponseMessage>? _messages;
public IList<ApiResponseMessage> Messages
{
get { return _messages; }
}
public bool HasMessage { get; set; }




#region Messages


public void AddErrorMessage(Abstractions.Exceptions.CaspianExc eption caspianException)
{
_messages?.Add(new ApiResponseMessage
{
Type = nameof(ApiResponseMessageEnum.Error),
Message = caspianException.Message,
});


HasMessage = true;
HasError = true;
}


public void AddWarningMessage(Abstractions.Exceptions.CaspianE xception caspianException)
{
_messages?.Add(new ApiResponseMessage
{
Type = nameof(ApiResponseMessageEnum.Warning),
Message = caspianException.Message,
});


HasMessage = true;
}




public void AddDangerMessage(Abstractions.Exceptions.CaspianEx ception caspianException)
{
_messages?.Add(new ApiResponseMessage
{
Type = nameof(ApiResponseMessageEnum.Danger),
Message = caspianException.Message,
});


HasMessage = true;
}




public void AddInformationMessage(Abstractions.Exceptions.Casp ianException caspianException)
{
_messages?.Add(new ApiResponseMessage
{
Type = nameof(ApiResponseMessageEnum.Information),
Message = caspianException.Message,
});


HasMessage = true;
}




public void ClearMessages()
{
_messages?.Clear();
HasMessage = false;
}




#endregion




public class ApiResponseMessage
{
public string Type { get; set; } = string.Empty;
public string Message { get; set; } = string.Empty;
}


public enum ApiResponseMessageEnum
{
Error,
Warning,
Danger,
Information
}
}

mmbguide
شنبه 08 اردیبهشت 1403, 14:51 عصر
از کلاس ApiResponse برای نوع برگشتی از تمامی Apiها استفاده میکنم.

fakhravari
یک شنبه 09 اردیبهشت 1403, 14:27 عصر
builder.Services.AddControllersWithViews()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNameCaseInse nsitive = true;
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});


builder.Services.AddControllersWithViews().AddNewt onsoftJson(options => { options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; });

mmbguide
یک شنبه 09 اردیبهشت 1403, 16:16 عصر
تشکر جناب فخرآوری. سوالم این بود که NameCaseSensitive برای Front کارها مهمه؟

fakhravari
دوشنبه 10 اردیبهشت 1403, 00:09 صبح
تشکر جناب فخرآوری. سوالم این بود که NameCaseSensitive برای Front کارها مهمه؟
اره. در هر زبانی یه مشکلاتی برای map کردن پیش میاد