【发布时间】:2023-01-30 23:40:56
【问题描述】:
我在这个问题中看到:Empty string becomes null when passed from Delphi to C# as a function argument,实际上 Delphi 的空字符串值只是一个空指针——我理解背后的原因。
我确实遇到了一个问题,因为我在 Delphi 中开发 Web API,并且在实现 PATCH 端点时遇到问题,我想知道是否有人遇到过与我相同的问题。
如果我有一个简单的资源Person,它看起来像这样。
{
"firstName": "John",
"lastName": "Doe",
"age": 44
}
并且只是想使用 PATCH 文档更改他的 lastName 属性 - 我会发送一个如下所示的请求:
{
"lastName": "Smith"
}
现在 - 在我的 api 中,使用 Delphis System.JSON 库,我只检查请求是否具有 firstName 和 age 属性,然后再将它们设置在请求处理程序中,请求处理程序在中间对象 PersonDTO 中设置属性,但稍后我必须将这些值映射到实际的 Person 实例 - 我的问题来了:
在多个对象之间进行映射时,我无法判断一个字符串是否为空,因为它从未被设置(并且应该被视为 null)或者被显式设置为 '' 以从我的资源中删除一个属性 - 我该如何避免这种情况?
if personDTO.FirstName <> '' then
personObject.FirstName := personDTO.FirstName;
编辑:我考虑过在DTO的构造函数中将字符串设置为#0,以区分null和'',但这是一个很大的(1M行)代码库,所以我更愿意找到一个健壮的泛型处理这些情况的方法
【问题讨论】:
-
我相信您不应该使用中间对象,而应该直接更新
Person对象 - 并且只更新 JSON 中提供的那些属性。 Pascal 字符串实际上是指向一个数据结构的指针,该数据结构包含另一个指向实际文本的指针以及字符串的长度。因此,您可能会尝试区分 NIL 字符串和指向 "" 的字符串 - 但我认为这不是一种可靠的方法。 -
@IVOGELOV 不幸的是,这对我来说不是一个选择,因为我在示例中稍微简化了情况。我们在我们的公共 api 中有一个抽象层,它将两种实体类型分开,然后我们将它们合并为一个。 (人 + 就业 = 雇员)
-
在 Delphi 中,字符串类型不可为空。字符串可以为空但仍然存在。当使用需要 PChar 的字符串时,您可能会感到困惑。如果字符串为空,则 PChar 将为空指针。
-
我明白你在说什么 - 但我想我可以更好地提出我的问题。我完全了解字符串在 Delphi 中的工作原理。我也确信我不是第一个遇到这个问题的人——我只是在寻找解决问题的灵感。也许我应该这样表述:如果一个属性在 API 定义中是可选的,我将如何判断该属性是否未被传递并且默认为
''(意味着不更改此属性)- 或者属性''已通过,用户希望将其设置为空字符串 -
@IVOGELOV“Pascal 字符串实际上是指向数据结构的指针它持有另一个指针到实际的文本" - 这是不正确的。文本是数据结构本身的一部分。分配的结构足够大,可以在其末尾容纳全文。没有第二个指针。