我記得在反序列化的同時序列化Int32
和獲得Int64
的問題。我的問題更一般,我有一個object
s的陣列,它可以將Int32放在Int64旁邊。如何在保留類型的同時取消/序列化任意數據?
所以我無法在反序列化中編寫自定義轉換器,並且一味地假設一切都是Int32/Int64。
如何在這種情況下處理序列化/反序列化?
我記得在反序列化的同時序列化Int32
和獲得Int64
的問題。我的問題更一般,我有一個object
s的陣列,它可以將Int32放在Int64旁邊。如何在保留類型的同時取消/序列化任意數據?
所以我無法在反序列化中編寫自定義轉換器,並且一味地假設一切都是Int32/Int64。
如何在這種情況下處理序列化/反序列化?
可以使用UntypedToTypedValueConverter
從JSON.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。
非常感謝,雖然這很尷尬,因爲即使在最簡單的情況下(如上所述),我還是會找回所有的值。現在我不能說出爲什麼,只是'WriteJson'被調用,但是'ReadJson'被完全忽略。我看,看,不明白爲什麼它被忽略。 – astrowalker
@astrowalker - 我添加了一個示例[fiddle](https://dotnetfiddle.net/FPdg5B)。 – dbc
謝謝,終於找到了!如果爲'RootObject'添加顯式構造函數以獲取對象數組,並設置'Items',則不會調用ReadJson方法。再次非常感謝你! (我提出了投票,但他們不可見)。 – astrowalker
這些Int32事件是否可預測? –
看起來像[JSON.net(de)serialize untyped property](https://stackoverflow.com/questions/38777588/json-net-deserialize-untyped-property)。 – dbc
@DominiqueLorre,不,完全沒有。 – astrowalker