【问题标题】:TJSONUnMarshal: how to track what is actually unmarshalledTJSONUnMarshal:如何跟踪实际未编组的内容
【发布时间】:2016-06-07 09:42:47
【问题描述】:

除了为每个字段编写自己的还原器之外,还有其他方法可以跟踪未编组的内容吗?
我正在根据 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" }  ] }

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

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

我使用的是delphi 10。

【问题讨论】:

  • 在 JSON 规范中,空值和空字符串是有区别的。你到底想要什么?
  • 感谢您的回复。在这个例子中,我不知道名称字段是否真的存在于 json 中。这是因为客户端应用程序仅在 json 中发送关键字段和修改字段。而且因为 Unmarshaller 遍历类字段,所以永远不会调用属性设置器。我想知道我是否可以以某种方式自定义解组器。我查看了源代码并注意到有 JsonReflectAttribute 属性,但我无法理解如何使用它。

标签: json delphi datasnap delphi-10-seattle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 2010-11-26
      • 2017-11-05
      相关资源
      最近更新 更多