动态 c# ValueKind = 对象
dynamic c# ValueKind = Object
因为我正在尝试使用 JsonSerializer.Deserialize 使用调试器访问 对象值 。
下面是我的结果。
OtpData = ValueKind = Object : "{
"OTP":"3245234",
"UserName":"mohit840",
"type":"SuperAdmin"
}"
当我尝试使用 var Data = JsonSerializer.Deserialize(OtpData)
访问它时,出现以下错误。
如何访问内部并获取以下对象的值。
"OTP":"3245234",
"UserName":"mohit840",
"type":"SuperAdmin"
更新:
[AllowAnonymous]
[HttpPost("ValidateOTP")]
public IActionResult ValidOTP(dynamic OtpData)
{
bool Result = false;
var Data = JsonSerializer.Deserialize(OtpData);
if (OtpData.type == "SuperAdmin")
{
Users _Users = _Context.Users.FirstOrDefault(j => j.Username == "");
if (_Users != null)
{
_Users.OTP = OtpData.OTP;
_Users.VerififedOTP = true;
_Context.SaveChanges();
Result = true;
}
}
else
{
Staff _Staff = _Context.Staffs.FirstOrDefault(j => j.Username == "");
if (_Staff != null)
{
_Staff.OTP = OtpData.OTP;
_Staff.VerififedOTP = true;
_Context.SaveChanges();
Result = true;
}
}
return Ok(new { Result = Result });
}
更新二:
因为我是通过 Postman 应用程序.
发布的
{
"OTP":"3245234",
"UserName":"mohit840",
"type":"SuperAdmin"
}
public class OtpData {
[JsonPropertyName("OTP")]
public string Otp { get; set; }
[JsonPropertyName("UserName")]
public string UserName { get; set; }
[JsonPropertyName("type")]
public string Type { get; set; }
}
public IActionResult ValidOTP(OtpData data)
{
bool result = false;
if (data.Type.ToString() == "SuperAdmin") { }
}
来自 Asp.net Core 3.0 的新版本 Microsoft 随 System.Text.Json 引入了新的 JsonElement
ValueKind
所以 ValueKind
来自 System.Text.Json
图书馆和 JsonConvert
来自 Newtonsoft
图书馆。
分辨率:-
您可能在序列化您可能使用过的对象时混用了这两个库 Newtonsoft.Json
,而在反序列化时您可能使用了 System.Text.Json
,反之亦然。
找到了解决问题的真正方法我使用 JObject
而不是 dynamic
。下面是一个示例。
public ResponseWrapper<GenericResponseModel> PostServiceStreams(JObject jObject)
{
return ResponseService.ReturnResponse(() =>
{
return new GenericResponseModel(true, string.Empty,database.MarkedIssues.Select(j => j).ToList().Select(i => i.MapMarkedIssuesModels()).ToList());
}, Request);
}
您可以获得如下所示的值。
{
"OTP":"3245234",
"UserName":"mohit840",
"type":"SuperAdmin"
}
这是我要发送的对象。下面是接收方法
jObject["OTP"].ToString();
参考System.Text.Json.JsonSerializer而不是newton softjson序列化器
class OTPData{ public string OTP {get;set} ....... }
var result = System.Text.Json.JsonSerializer.Deserialize<OTPData>
(response.ToString());
string otp = result.OTP;
string username = result.UserName;
string type = result.type;
public async Task<dynamic> PostAsync([FromBody] Object post)
{
var data = JsonConvert.DeserializeObject<dynamic>(post.ToString());
ASP.Net 核心使用基于 System.Text.Json 的内置 Json 转换器来绑定发送的 json 输入的模型。如果您在项目中使用 Newtonsoft Json,则需要对其进行配置以将其用于模型绑定。
为此,您需要安装 nuget 包“Microsoft.AspNetCore.Mvc.NewtonsoftJson”并添加行“builder.Services.AddControllers().AddNewtonsoftJson();”到 Program.cs。这将按名称和值正确序列化 expando 对象。
ValueKind 是 json 格式的 System.Text.Json 数据。我们可以使用 Newtonsoft.Json 将其转换为任何类型,如下所示:
public class OtpData
{
public string Otp { get; set; }
public string UserName { get; set; }
public string Type { get; set; }
}
public OtpData GetOtpData(object otpData)
{
var jsonString = ((System.Text.Json.JsonDocument)otpData).RootElement.GetRawText();
return JsonConvert.DeserializeObject<OtpData>(jsonString);
}
因为我正在尝试使用 JsonSerializer.Deserialize 使用调试器访问 对象值 。
下面是我的结果。
OtpData = ValueKind = Object : "{
"OTP":"3245234",
"UserName":"mohit840",
"type":"SuperAdmin"
}"
当我尝试使用 var Data = JsonSerializer.Deserialize(OtpData)
访问它时,出现以下错误。
如何访问内部并获取以下对象的值。
"OTP":"3245234",
"UserName":"mohit840",
"type":"SuperAdmin"
更新:
[AllowAnonymous]
[HttpPost("ValidateOTP")]
public IActionResult ValidOTP(dynamic OtpData)
{
bool Result = false;
var Data = JsonSerializer.Deserialize(OtpData);
if (OtpData.type == "SuperAdmin")
{
Users _Users = _Context.Users.FirstOrDefault(j => j.Username == "");
if (_Users != null)
{
_Users.OTP = OtpData.OTP;
_Users.VerififedOTP = true;
_Context.SaveChanges();
Result = true;
}
}
else
{
Staff _Staff = _Context.Staffs.FirstOrDefault(j => j.Username == "");
if (_Staff != null)
{
_Staff.OTP = OtpData.OTP;
_Staff.VerififedOTP = true;
_Context.SaveChanges();
Result = true;
}
}
return Ok(new { Result = Result });
}
更新二: 因为我是通过 Postman 应用程序.
发布的{
"OTP":"3245234",
"UserName":"mohit840",
"type":"SuperAdmin"
}
public class OtpData {
[JsonPropertyName("OTP")]
public string Otp { get; set; }
[JsonPropertyName("UserName")]
public string UserName { get; set; }
[JsonPropertyName("type")]
public string Type { get; set; }
}
public IActionResult ValidOTP(OtpData data)
{
bool result = false;
if (data.Type.ToString() == "SuperAdmin") { }
}
来自 Asp.net Core 3.0 的新版本 Microsoft 随 System.Text.Json 引入了新的 JsonElement
ValueKind
所以 ValueKind
来自 System.Text.Json
图书馆和 JsonConvert
来自 Newtonsoft
图书馆。
分辨率:-
您可能在序列化您可能使用过的对象时混用了这两个库 Newtonsoft.Json
,而在反序列化时您可能使用了 System.Text.Json
,反之亦然。
找到了解决问题的真正方法我使用 JObject
而不是 dynamic
。下面是一个示例。
public ResponseWrapper<GenericResponseModel> PostServiceStreams(JObject jObject)
{
return ResponseService.ReturnResponse(() =>
{
return new GenericResponseModel(true, string.Empty,database.MarkedIssues.Select(j => j).ToList().Select(i => i.MapMarkedIssuesModels()).ToList());
}, Request);
}
您可以获得如下所示的值。
{
"OTP":"3245234",
"UserName":"mohit840",
"type":"SuperAdmin"
}
这是我要发送的对象。下面是接收方法
jObject["OTP"].ToString();
参考System.Text.Json.JsonSerializer而不是newton softjson序列化器
class OTPData{ public string OTP {get;set} ....... }
var result = System.Text.Json.JsonSerializer.Deserialize<OTPData>
(response.ToString());
string otp = result.OTP;
string username = result.UserName;
string type = result.type;
public async Task<dynamic> PostAsync([FromBody] Object post)
{
var data = JsonConvert.DeserializeObject<dynamic>(post.ToString());
ASP.Net 核心使用基于 System.Text.Json 的内置 Json 转换器来绑定发送的 json 输入的模型。如果您在项目中使用 Newtonsoft Json,则需要对其进行配置以将其用于模型绑定。
为此,您需要安装 nuget 包“Microsoft.AspNetCore.Mvc.NewtonsoftJson”并添加行“builder.Services.AddControllers().AddNewtonsoftJson();”到 Program.cs。这将按名称和值正确序列化 expando 对象。
ValueKind 是 json 格式的 System.Text.Json 数据。我们可以使用 Newtonsoft.Json 将其转换为任何类型,如下所示:
public class OtpData
{
public string Otp { get; set; }
public string UserName { get; set; }
public string Type { get; set; }
}
public OtpData GetOtpData(object otpData)
{
var jsonString = ((System.Text.Json.JsonDocument)otpData).RootElement.GetRawText();
return JsonConvert.DeserializeObject<OtpData>(jsonString);
}