是否有另一种方法可以跟踪每个字段的编组内容,而不是为每个字段编写自己的恢复器? 我正在根据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.
答案 0 :(得分:0)
在Rest.Json单元中,定义了一个TJson类,它提供了几种方便的方法,比如将对象转换为JSON,反之亦然。具体来说,它有一个类函数JsonToObject,您可以在其中指定选项,例如忽略空字符串或忽略空数组。我认为TJson课程可以为你服务。对于解组复杂的业务对象,您必须编写自定义转换器。
答案 1 :(得分:0)
实际上,我的问题终于很难解决了。 而不是使用TJSONUnMarshal.tryCreateObject我现在使用TJSONUnMarshal.CreateObject。第一个具有使用out修饰符声明的对象参数,但CreateObject具有Object参数var修饰符,因此我能够 创建对象,从数据库初始化它并将其传递给CreateObject,它只修改json消息中的字段。