Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于系统命名,从JSON主体到模型的映射问题_C#_Asp.net Core Webapi - Fatal编程技术网

C# 由于系统命名,从JSON主体到模型的映射问题

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,

在请求正文I中有一个名为
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.stt
Asp.Net Core
使用
jsonvert
来反序列化对象,我假设它与
Startup
中的
AddJsonOptions
或项目中的任何其他内容有关。@Edward实际上问题在于
NamingStrategy=new SnakeCaseNamingStrategy()
。你可以把它作为一个答案发布,我会接受它,以便对其他有类似问题的人有用。这是一个非常奇怪的问题。当我使用隐式反序列化时,它总是作为
0
传递,但是当我尝试将请求正文保存为字符串,然后使用
JsonConvert
反序列化时,一切正常。谢谢。@stefan.stt
Asp.Net Core
使用
jsonvert
来反序列化对象,我假设它与
Startup
中的
AddJsonOptions
或项目中的任何其他内容有关。@Edward实际上问题在于
NamingStrategy=new SnakeCaseNamingStrategy()
。你可以把它作为一个答案,我会接受它,以便对其他有类似问题的人有用。