2016-06-07 28 views
0

是否有另一種方法來跟蹤每個字段的編寫自己的逆變器未編組?
我基於JSON的消息來更新我的本地數據和我的問題是(簡體): 我期待JSON像TJSONUnMarshal:如何跟蹤什麼是實際解組

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

它通過

UnMarshaller.TryCreateObject(TItems, TJsonObject(OneJsonElement), TargetItem ) 

然後取消封送類TItems我的問題是,我不能讓

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

之間的差異
{ "items": [ { "id":1, "price":"12.34" } ] } 

在這兩種情況下,名稱是空白的,我想只更新json消息傳遞的那些字段。當然,我可以爲每個領域創建一個回覆,但是有很多字段和消息,所以它非常龐大。

我試圖尋找REST.Jsonreflect.pas源碼,但沒有意義。

我使用的Delphi 10.

+0

在JSON規範中,空值與空字符串之間存在差異。你想要什麼? – Erwin

+0

感謝您的回覆。 在這個例子中,我不想知道名稱字段實際上是否存在於json中。這是因爲客戶端應用只發送json中的關鍵字段和修改字段。而且由於Unmarshaller通過類字段不會調用屬性設置器。 我想知道如果我能以某種方式定製unmarshaller。我查看源代碼並注意到有JsonReflectAttribute屬性,但我無法理解如何使用它。 – MikaK

回答

0

其實,我的問題終於很容易解決。 而不是使用TJSONUnMarshal.tryCreateObject我現在使用TJSONUnMarshal.CreateObject。首先有用out修飾符聲明的對象參數,但CreateObject有Object參數var修飾符,所以我能夠創建對象,從數據庫初始化它並將它傳遞給CreateObject,它只修改json消息中的字段。

0

在Rest.Json單元有限定的TJson類提供了幾個方便的方法類似的對象轉換爲JSON,反之亦然。具體來說,它有一個類函數JsonToObject,您可以在其中指定選項,例如忽略空字符串或忽略空數組。我認爲TJson課可以爲你服務。爲了解開復雜的業務對象,您必須編寫自定義轉換器。