C# 由于系统命名,从JSON主体到模型的映射问题
在请求正文I中有一个名为C# 由于系统命名,从JSON主体到模型的映射问题,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,在请求正文I中有一个名为systemDate的属性。在我的模型中,此属性总是设置为0,我认为这是因为变量类型(long,double,等等)但是,在请求主体中将名称从systemDate更改为someDate,在模型类中将名称从systemDate更改为someDate之后,该值将按预期的方式从请求主体传递到模型实例 为什么会发生这种情况?有没有办法保持请求的json命名并使其将其值传递给模型 { "category":"some_category", "level":5,
systemDate
的属性。在我的模型中,此属性总是设置为0
,我认为这是因为变量类型(long
,double
,等等)但是,在请求主体中将名称从systemDate
更改为someDate
,在模型类中将名称从systemDate
更改为someDate
之后,该值将按预期的方式从请求主体传递到模型实例
为什么会发生这种情况?有没有办法保持请求的json命名并使其将其值传递给模型
{
"category":"some_category",
"level":5,
"source":"some_source",
"location":"some_location",
"date":2793455394017,
"message":"some_message",
"id":3295830,
"systemDate":1533114073596991534
}
下面是我的模型类的外观:
public class MyModel
{
public MyModel()
{
}
public string Category { get; set; }
public int Level { get; set; }
public string Source { get; set; }
public string Location { get; set; }
public double Date { get; set; }
public string Message { get; set; }
public long Id { get; set; }
public double SystemDate { get; set; }
}
以及控制器方法:
[HttpPost(EndpointUrlConstants.MY_ENDPOINT)]
public async Task<IActionResult> DoSomething([FromBody] MyModel myModel)
{
// Some Code
return this.Ok();
}
[HttpPost(EndpointUrlConstants.MY_ENDPOINT)]
公共异步任务DoSomething([FromBody]MyModel MyModel)
{
//一些代码
返回这个;
}
我不确定是否理解您的问题,但您可以使用属性控制序列化,即json字符串中的属性名称不必与模型中的属性名称匹配
public class MyModel
{
public MyModel()
{
}
[JsonProperty("category")]
public string Category { get; set; }
[JsonProperty("level")]
public int Level { get; set; }
[JsonProperty("source")]
public string Source { get; set; }
[JsonProperty("location")]
public string Location { get; set; }
[JsonProperty("date")]
public double Date { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
[JsonProperty("id")]
public long Id { get; set; }
[JsonProperty("systemDate")]
public double SomeDate { get; set; }
}
使用Newtonsoft.Json nuget包测试代码:
string json = @"{
""category"":""some_category"",
""level"":5,
""source"":""some_source"",
""location"":""some_location"",
""date"":2793455394017,
""message"":""some_message"",
""id"":3295830,
""systemDate"":1533114073596991534
}";
MyModel model = JsonConvert.DeserializeObject<MyModel>(json);
stringjson=@{
“类别”:“某些类别”,
“级别”:5,
“来源”:“某些来源”,
“”位置“”:“”某些位置“”,
“日期”:2793455394017,
“消息”:“一些消息”,
“id”:3295830,
“系统日期”:1533114073596991534
}";
MyModel model=JsonConvert.DeserializeObject(json);
对象已正确反序列化。如您所见,模型中的
SomeDate
属性映射到json字符串中的systemDate
属性。我不确定是否理解您的问题,但您可以使用属性控制序列化,即json字符串中的属性名称不必与模型中的属性名称匹配
public class MyModel
{
public MyModel()
{
}
[JsonProperty("category")]
public string Category { get; set; }
[JsonProperty("level")]
public int Level { get; set; }
[JsonProperty("source")]
public string Source { get; set; }
[JsonProperty("location")]
public string Location { get; set; }
[JsonProperty("date")]
public double Date { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
[JsonProperty("id")]
public long Id { get; set; }
[JsonProperty("systemDate")]
public double SomeDate { get; set; }
}
使用Newtonsoft.Json nuget包测试代码:
string json = @"{
""category"":""some_category"",
""level"":5,
""source"":""some_source"",
""location"":""some_location"",
""date"":2793455394017,
""message"":""some_message"",
""id"":3295830,
""systemDate"":1533114073596991534
}";
MyModel model = JsonConvert.DeserializeObject<MyModel>(json);
stringjson=@{
“类别”:“某些类别”,
“级别”:5,
“来源”:“某些来源”,
“”位置“”:“”某些位置“”,
“日期”:2793455394017,
“消息”:“一些消息”,
“id”:3295830,
“系统日期”:1533114073596991534
}";
MyModel model=JsonConvert.DeserializeObject(json);
对象已正确反序列化。如您所见,模型中的
SomeDate
属性映射到json字符串中的systemDate
属性。对于Asp.Net核心
,我们可以通过启动
中的添加JSONOPTIONS
配置json序列化设置
这个问题的根本原因与NamingStrategy=new SnakeCaseNamingStrategy()
有关。对于Asp.Net核心
,我们可以通过启动
中的添加JSONOPTIONS
配置Json序列化设置
此问题的根本原因与NamingStrategy=new snakecasenaminingstrategy()
您的模型没有指定SystemDate
property@RuudKobes对不起,我的错。我编辑了这篇帖子。@stefan.stt上面写着SytemDate
这是打字错误吗?你仍然有一个打字错误@stefan.stt,它应该是SystemDate
而不是SytemDate
,对吗?@phuzi Sory,打字错误。问题仍然存在。您的模型未指定SystemDate
property@RuudKobes对不起,我的错。我编辑了这篇帖子。@stefan.stt上面写着SytemDate
这是打字错误吗?你仍然有一个打字错误@stefan.stt,它应该是SystemDate
而不是SytemDate
,对吗?@phuzi Sory,打字错误。问题仍然存在。这是一个非常奇怪的问题。当我使用隐式反序列化时,它总是作为0
传递,但是当我尝试将请求正文保存为字符串,然后使用JsonConvert
反序列化时,一切正常。谢谢。@stefan.sttAsp.Net Core
使用jsonvert
来反序列化对象,我假设它与Startup
中的AddJsonOptions
或项目中的任何其他内容有关。@Edward实际上问题在于NamingStrategy=new SnakeCaseNamingStrategy()
。你可以把它作为一个答案发布,我会接受它,以便对其他有类似问题的人有用。这是一个非常奇怪的问题。当我使用隐式反序列化时,它总是作为0
传递,但是当我尝试将请求正文保存为字符串,然后使用JsonConvert
反序列化时,一切正常。谢谢。@stefan.sttAsp.Net Core
使用jsonvert
来反序列化对象,我假设它与Startup
中的AddJsonOptions
或项目中的任何其他内容有关。@Edward实际上问题在于NamingStrategy=new SnakeCaseNamingStrategy()
。你可以把它作为一个答案,我会接受它,以便对其他有类似问题的人有用。