动态 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);
}