首页 > 解决方案 > 由于系统命名,从 JSON 主体映射到模型问题

问题描述

在请求正文中,我有一个名为systemDate. 此属性始终0在我的模型中设置为,我认为这是因为变量类型(long,double等),但是在我将请求正文中的名称从systemDateto更改为模型类中的to之后,值是从请求传递的body 到模型实例,就像它应该是一样的。someDateSystemDateSomeDate

为什么会发生这种情况,有没有办法保持请求 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();
    }

标签: c#asp.net-core-webapi

解决方案


我不确定我是否理解您的问题,但是您可以使用属性控制序列化,即 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);

对象已正确反序列化。如您所见,SomeDate模型中的属性被映射为匹配systemDatejson 字符串中的属性。


推荐阅读