2016-10-10 23 views
4

考慮下面的代碼:Newtonsoft.JSON:JSON列表和數組處理方式不同

public class ColorList 
{ 
    public List<string> Colors = new List<string>(new string[1] { "#eeeeee"}); 
} 
public class ColorArray 
{ 
    public string[] Colors = new string[1] { "#eeeeee"}; 
} 

public class Program 
{ 
    public static void Main() 
    { 
     string json = "{Colors:['#abc','#123']}"; 

     // Deserialize Colors into List: 
     Console.WriteLine(JsonConvert.DeserializeObject<ColorList>(json).Colors.Count); 
     // returns 3 
     // Deserialize Colors into Array: 
     Console.WriteLine(JsonConvert.DeserializeObject<ColorArray>(json).Colors.Length); 
     // returns 2 
    } 
} 

爲什麼會出現兩個deserializations之間的差異?

+2

聽起來就像它添加到列表(因爲它可以),但取代整個數組(因爲它不能做任何其他事情,但我猜它可能會複製原始值)。如果你只是改變你的代碼,以便新創建的對象沒有任何條目,你應該沒問題。 –

+0

我試過你的代碼和@JonSkeet似乎是正確的。在列表中,添加新值不是問題,但是在數組中,您必須重新創建它,因爲一旦它具有不能(容易)重新維度的維度。無論如何,這對我來說確實是一種意想不到的行爲,因爲我預計在反序列化時會出現一個新的集合。 – Pikoh

+0

串行器和解串器不是反函數嗎?序列化程序和反序列化程序是否被認爲是一個錯誤? – Alexander

回答

3

除了喬恩斯基特評論,想補充一點,你可能會部分地控制這種行爲:

var settings = new JsonSerializerSettings() { 
    ObjectCreationHandling = ObjectCreationHandling.Replace 
}; 
Console.WriteLine(JsonConvert.DeserializeObject<ColorList>(json, settings).Colors.Count); // returns 2, because list was replaced, not reused 

但是,即使你將使用ObjectCreationHandling.Reuse與陣列 - 它不會重新使用它,但還是會取代(無論如何它無法真正重用)。

既然你寫道,你會期望反序列化的新集合 - 這可能會幫助你。

+0

我不知道那個環境,謝謝 – Pikoh

相關問題