TJSONUnMarshal:如何跟踪实际上未编组的内容

时间:2016-06-07 09:42:47

标签: json delphi datasnap delphi-10-seattle

是否有另一种方法可以跟踪每个字段的编组内容,而不是为每个字段编写自己的恢复器? 我正在根据json消息更新我的本地数据,我的问题是(简化): 我期待json喜欢

{ "items":  [ { "id":1, "name":"foobar",  "price":"12.34" }  ] }

然后通过

解组到TItems类
UnMarshaller.TryCreateObject( TItems, TJsonObject( OneJsonElement ),  TargetItem  ) 

我的问题是我无法区分

{ "items":  [ { "id":1, "name":"",  "price":"12.34" }  ] }

{ "items":  [ { "id":1,  "price":"12.34" }  ] }

在这两种情况下,name都是空白的,我只想更新那些在json消息上传递的字段。当然,我可以为每个字段创建一个还原,但是有很多字段和消息,所以它非常庞大。

我试图查看REST.Jsonreflect.pas源代码,但是没有意义。

我正在使用delphi 10.

2 个答案:

答案 0 :(得分:0)

在Rest.Json单元中,定义了一个TJson类,它提供了几种方便的方法,比如将对象转换为JSON,反之亦然。具体来说,它有一个类函数JsonToObject,您可以在其中指定选项,例如忽略空字符串或忽略空数组。我认为TJson课程可以为你服务。对于解组复杂的业务对象,您必须编写自定义转换器。

答案 1 :(得分:0)

实际上,我的问题终于很难解决了。 而不是使用TJSONUnMarshal.tryCreateObject我现在使用TJSONUnMarshal.CreateObject。第一个具有使用out修饰符声明的对象参数,但CreateObject具有Object参数var修饰符,因此我能够 创建对象,从数据库初始化它并将其传递给CreateObject,它只修改json消息中的字段。