我正在尝试更新用户的辅助信息(地址、电子邮件、externalIds、ims、电话、组织、关系 -补丁页面上列出的数组等内容)。我能够成功地进行身份验证,添加新信息(一次一个或多个)并删除一个,只要它留下一个(我更新 JArray,只留下我想要的一个)。
所以,如果我有 3 个地址,我可以删除一两个地址,它会适当地更新。我可以轻松地使用补丁来清除和更新普通信息,例如名字和姓氏、重命名用户和更新密码。
但是,如果我尝试删除所有一种类型的信息,则什么也不会发生。我尝试将用户地址属性设置为 null 以及空列表或数组。通过调试,我已经验证了它发送的用户补丁是准确的,但服务器端似乎没有发生任何事情。
我尝试使用完整的更新,以及一次又一次地使用空列表或空列表,但同样的问题发生了。
我需要做什么才能完全清除这些属性之一?
示例代码:
//Try both a full user for an update and a blank user for a patch
User uRetrieved = directoryServiceDict[Domain].Users.Get(fullEmail).Execute();
User uPatch = new User();
uPatch.Addresses = null;
uRetrieved.Addresses = new List<Address>();
//try both a patch and update
directoryServiceDict[Domain].Users.Patch(uPatch, u.PrimaryEmail).Execute();
directoryServiceDict[Domain].Users.Update(uRetrieved, u.PrimaryEmail).Execute();
更新:我进行了一系列测试,试图通过我能通过的任何东西,但没有任何效果。在挖掘 API 源代码后,我发现我可以调用服务的 Serializer 方法来查看它正在输出什么,我发现给它分配一个空字符串和一个空列表,一个带有一个空字符串的列表,一个新地址(对于例如)对象和带有新地址对象的列表都不起作用。然而,序列化程序按预期抛出了它们。
但是,如果我将它设置为 null,它就会被忽略。
查看补丁语义页面后,我看到以下内容:
要删除字段,请指定该字段并将其设置为空。例如,“评论”:null。您还可以通过将其设置为 null 来删除整个对象(如果它是可变的)。
查看给定的示例,他们希望数据显示{"addresses":null}
为与其他任何变体(如{"addresses":""}
、{"addresses":[]}
或)相似,而不是{"addresses":[""]}
。
在花了一些时间深入研究 API 代码之后,我找到了他们使用的序列化器的第 42 行,他们在其中将序列化器设置设置为忽略 null(例如,我假设有助于保持较低的数据量以进行修补)。
这适用于大多数事情,但意味着在尝试修补或更新时,序列化程序会忽略设置为 null 的值,因此服务器看不到该条目并且不会删除它。
因此,我正在努力找出解决此问题的最佳方法。我将在 StackOverflow 上查看其他一些帖子,希望我能够解决它(除非有人先得到它)。如果我这样做,我会发布一个答案。
更新 2:通过为 String 类型创建新的定制器,我能够获取代码以打印出包括 Null 的序列化字符串。每次运行代码时,它都会生成一个自定义的 NullToken(基本上是一个生成的 GUID,我在上面添加了一个词),它被设置为我要删除的字段的字符串值。然后,当序列化程序遇到一个字符串时,它会检查该字符串是否与 NullToken 匹配。如果是这样,我使用 jsonWriter 方法WriteNull()
。否则,我只是将它传递给将军WriteValue()
。
然后我只需要自定义一系列类(传递给服务的初始化程序、作为初始化程序一部分的 NewtonsoftJsonSerializer 和添加到 NJS 设置的定制程序)并将它们设置为使用而不是默认值创建服务时。
现在我的代码正确地抽出了类似的东西{"addresses":null}
,我对此感到高兴。
不幸的是,它仍然不起作用。我在 API 资源管理器中进行了更多测试,并意识到即使返回的对象显示了您输入的内容的更新,但实际上并没有发生任何事情。我认为它根本没有删除,因此我为 API 本身打开了一个问题。如果结果是我自己的错,我会在这里抛出一个答案。
摘要:我现在相当确定问题出在 Google API 本身。