TJSONUnMarshal:如何跟踪实际解组的内容
TJSONUnMarshal: how to track what is actually unmarshalled
除了为每个字段编写自己的还原器之外,还有其他方法可以跟踪未编组的内容吗?
我正在根据 json 消息更新我的本地数据,我的问题是(简化):
我期待 json 喜欢
{ "items": [ { "id":1, "name":"foobar", "price":"12.34" } ] }
然后由
解组为 class 个 TItems
UnMarshaller.TryCreateObject( TItems, TJsonObject( OneJsonElement ), TargetItem )
我的问题是我无法区分
{ "items": [ { "id":1, "name":"", "price":"12.34" } ] }
和
{ "items": [ { "id":1, "price":"12.34" } ] }
在这两种情况下,名称都是空白的,我只想更新 json 消息中传递的那些字段。当然我可以为每个字段创建一个还原,但是有很多字段和消息所以它非常庞大。
我试图查看 REST.Jsonreflect.pas 来源,但没有任何意义。
我正在使用 delphi 10.
在 Rest.Json 单元中定义了一个 TJson class,它提供了多种方便的方法,例如将对象转换为 JSON,反之亦然。具体来说,它有一个 class 函数 JsonToObject,您可以在其中指定选项,例如忽略空字符串或忽略空数组。我认为 TJson class 可以为您服务。不过,为了解组复杂的业务对象,您必须编写自定义转换器。
其实我的问题总算是简单的解决了。
我现在使用 TJSONUnMarshal.CreateObject 而不是 TJSONUnMarshal.tryCreateObject。第一个对象参数用 out 修饰符声明,但 CreateObject 有对象参数 var 修饰符,所以我能够
创建对象,从数据库中对其进行初始化并将其传递给仅修改 json 消息中的字段的 CreateObject。
除了为每个字段编写自己的还原器之外,还有其他方法可以跟踪未编组的内容吗?
我正在根据 json 消息更新我的本地数据,我的问题是(简化):
我期待 json 喜欢
{ "items": [ { "id":1, "name":"foobar", "price":"12.34" } ] }
然后由
解组为 class 个 TItemsUnMarshaller.TryCreateObject( TItems, TJsonObject( OneJsonElement ), TargetItem )
我的问题是我无法区分
{ "items": [ { "id":1, "name":"", "price":"12.34" } ] }
和
{ "items": [ { "id":1, "price":"12.34" } ] }
在这两种情况下,名称都是空白的,我只想更新 json 消息中传递的那些字段。当然我可以为每个字段创建一个还原,但是有很多字段和消息所以它非常庞大。
我试图查看 REST.Jsonreflect.pas 来源,但没有任何意义。
我正在使用 delphi 10.
在 Rest.Json 单元中定义了一个 TJson class,它提供了多种方便的方法,例如将对象转换为 JSON,反之亦然。具体来说,它有一个 class 函数 JsonToObject,您可以在其中指定选项,例如忽略空字符串或忽略空数组。我认为 TJson class 可以为您服务。不过,为了解组复杂的业务对象,您必须编写自定义转换器。
其实我的问题总算是简单的解决了。 我现在使用 TJSONUnMarshal.CreateObject 而不是 TJSONUnMarshal.tryCreateObject。第一个对象参数用 out 修饰符声明,但 CreateObject 有对象参数 var 修饰符,所以我能够 创建对象,从数据库中对其进行初始化并将其传递给仅修改 json 消息中的字段的 CreateObject。