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)。