C# WCF确定是否将JSON密钥发送到服务器,即使该值为null

C# WCF确定是否将JSON密钥发送到服务器,即使该值为null,c#,.net,json,wcf,rest,C#,.net,Json,Wcf,Rest,我正在执行PUT请求,以更新有关用户的信息。只有我在JSON请求中发送的密钥需要修改。这很有效,但我想包括删除信息的功能 当前,当我发送请求时,{“firstname”:“will”},WCF将反序列化对象并返回数据协定。这将生成类似于以下内容的对象: UserObject firstname => will, lastname => null, gender => null 这很好,因为我只更新不为null的值。但是,当涉及到删除我向上发送的值时,{

我正在执行
PUT
请求,以更新有关用户的信息。只有我在
JSON
请求中发送的密钥需要修改。这很有效,但我想包括删除信息的功能

当前,当我发送请求时,
{“firstname”:“will”}
,WCF将反序列化对象并返回数据协定。这将生成类似于以下内容的对象:

UserObject
    firstname => will,
    lastname => null,
    gender => null
这很好,因为我只更新不为null的值。但是,当涉及到删除我向上发送的值时,
{“firstname”:null}
-我发送密钥的事实决定了我希望它更新的操作,省略其他密钥意味着它将不处理它们

问题是自动反序列化给了我一个如下对象:

UserObject
    firstname => null,
    lastname => null,
    gender => null
我如何知道真正的请求有哪些键,以便更新这些值。我是否必须手动反序列化请求并在值上循环?或者,数据联系人是否有办法只向我提供请求所具有的选项


我已经尝试过
emitDefaultValue=false
,但这似乎只是为了序列化对象。

好吧,我会引入某种用户ID。问题是,您的主键(数据库语言)可以更改,这不是一个好主意


id不会改变,因此您可以始终识别对象。

我认为这是不可能的。在WCF操作中,只能获取反序列化对象,并且只能以一种方式解释null。正如您所注意到的,无论您是否在不发送该信息时显式地将值设置为null,WCF都将生成相同的对象

在我看来,如果您想要删除属性,您可以发送默认值。例如,对于字符串,您将发送空字符串,这样您的更新过程将正确地将值更新为空字符串,从而有效地删除它。对于其他类型,也可以发送一些默认值

例如:

{"firstname": ""}

抱歉-数据库中有一个主键,我将数据发送到的终点是/user/{:userID}-如果我希望用户能够删除信息-我希望能够发送{“firstname”:null},让WCF知道我希望删除ID为x的用户的名字。这是我们采用的解决方法,但对于处理数字类型或可为空的布尔值来说并不太好。我还在研究——如果我没有发现任何东西,你会得到适当的奖励。我认为这里的问题是,举例来说,可空布尔值对于你的用例来说是不够的。它有三种状态(true、false、null),您需要四种状态(true、false、notsent、null)。所以,潜在的解决方案是创建您自己的类型,并使用您需要的状态来影响WCF反序列化过程(通过实现自定义IDispatchMessageFormatter)。