从正文反序列化ASP.NET Core,带有默认值

时间:2018-11-08 16:49:15

标签: asp.net-core json.net deserialization asp.net-core-webapi

我有以下控制器(缩写):

public class ServicesController : Controller
{
    private readonly IServiceRepository _repo;
    public ServicesController(IServiceRepository repo)
    {
        _repo = repo;
    }

    [HttpPost]
    public async Task<StatusCodeResult> CreateService([FromBody] JsonServiceEntity service)
    {
        return await _repo.CreateServiceAsync(new ServiceEntity(service));
    }
}

JsonServiceEntity类如下所示(缩写):

public class JsonServiceEntity
{
    public string Id { get; set; } = Guid.NewGuid().ToString();
}

Id是Guid形式的字符串。如果从客户端传入,则应使用给定的ID。如果没有从客户端传递任何值,我应该生成一个新的guid并使用它。

但是,当客户端未提供默认值时,我无法使其使用默认值。不管怎样,它最终都是一个空字符串。我可以调试并观察它是否击中了该属性,并为默认值生成了一个新的guid,该值会通过调用带有空字符串的setter迅速被覆盖。

我在NullValueHandling的{​​{1}}上尝试了DefaultValueHandlingSerializerSettings的不同值,但这没有帮助。如果我在Startup.cs属性上设置了[Required],则会收到ModelState错误,让我知道尝试的值是Id,而不是空字符串。

如何获取默认值?

null

2 个答案:

答案 0 :(得分:5)

假设客户端实际上传递了一个空字符串作为Id,则可以使用DefaultValue属性指示Json.Net将空字符串作为默认值进行处理:

public class JsonServiceEntity
{
    [DefaultValue("")]
    public string Id { get; set; } = Guid.NewGuid().ToString();
}

然后在JSON配置中,将其设置为Ignore的默认值:

DefaultValueHandling = DefaultValueHandling.Ignore

请参见Documentation

答案 1 :(得分:3)

当您在自动实现的属性上指定默认值时:

select *
from 

( select irart, fiben1 as  "Benämning", fisald +irbant as "disp.saldo", sum(irbant) as "Lev.Best"
from triir00
left join trafi00
 on irart = fiart and irfili = fifili

where IRSTYP between 00 and 02 and irlev = '2602688' and irfili = 10 and fihugr = 5
group by irart,fiben1,irlev,fisald,irbant
) as antalLev 

full join

( select raart, fiben1 as "Benämning", raorn9 as "Ordernummer", fisald- raanta as  "Disp.Saldo", sum(raanta) as "Kund.Best"
 from trora00
        left outer join trohu00
         on huorn9 = raorn9
        left join trafi00
         on raart = fiart and rafili = fifili

 where rastyp <= 02 and rafili <> 0 and raotyp = 1 and ralev1 = '2602688' and fihugr = 5
 group by raart,fiben1,raorn9,fisald,raanta
) as antalBest
    on  antalLev.irart = antalBest.raart

仅在未设置任何值的情况下使用默认值。在此,如果客户端未设置ID,则根本不应该发送ID,即:

如果这是您当前的JSON:

public string Id { get; set; } = Guid.NewGuid().ToString();

那么客户端应该发送的是:

{
    "id": "",
    "name": "foo"
}

然后,将根据需要使用默认值。如果您无法实现此目的,或者只是想处理客户端错误地发送空字符串的情况,那么您将需要一个自定义的getter和setter:

{
    "name": "foo"
}