2016-09-12 38 views
2

我記得在反序列化的同時序列化Int32和獲得Int64的問題。我的問題更一般,我有一個object s的陣列,它可以將Int32放在Int64旁邊。如何在保留類型的同時取消/序列化任意數據?

所以我無法在反序列化中編寫自定義轉換器,並且一味地假設一切都是Int32/Int64。

如何在這種情況下處理序列化/反序列化?

+0

這些Int32事件是否可預測? –

+0

看起來像[JSON.net(de)serialize untyped property](https://stackoverflow.com/questions/38777588/json-net-deserialize-untyped-property)。 – dbc

+0

@DominiqueLorre,不,完全沒有。 – astrowalker

回答

0

可以使用UntypedToTypedValueConverterJSON.net (de)serialize untyped property,但有一點不同 - 你需要把它應用到陣列的項目,而不是使用[JsonProperty(ItemConverterType = typeof(UntypedToTypedValueConverter))]數組本身,如:

public class RootObject 
{ 
    [JsonProperty(ItemConverterType = typeof(UntypedToTypedValueConverter))] 
    public object [] Items { get; set; } 
} 

這適用於轉換器中的條目數組而不是數組本身。然後序列化與反序列化JsonSerializerSettings.TypeNameHandling = TypeNameHandling.Auto,例如: -

var root = new RootObject { Items = new object[] { 1, 1L, int.MaxValue, long.MaxValue } }; 
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; 
var json = JsonConvert.SerializeObject(root, settings); 
var root2 = JsonConvert.DeserializeObject<RootObject>(json, settings); 

fiddle

+0

非常感謝,雖然這很尷尬,因爲即使在最簡單的情況下(如上所述),我還是會找回所有的值。現在我不能說出爲什麼,只是'WriteJson'被調用,但是'ReadJson'被完全忽略。我看,看,不明白爲什麼它被忽略。 – astrowalker

+0

@astrowalker - 我添加了一個示例[fiddle](https://dotnetfiddle.net/FPdg5B)。 – dbc

+0

謝謝,終於找到了!如果爲'RootObject'添加顯式構造函數以獲取對象數組,並設置'Items',則不會調用ReadJson方法。再次非常感謝你! (我提出了投票,但他們不可見)。 – astrowalker

相關問題