2016-10-10 2 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 
    } 
} 

なぜ2 deserializationsの違いはありますか?それはそれを再利用しないだろうが、それでも置き換えます - あなたは、配列でObjectCreationHandling.Reuseを使用する場合でも、しかし

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

、:ジョンスキートのコメントに加えて

+2

(それができるので)リストに追加しているように聞こえますが、配列全体が置き換えられます(元の値をコピーできるとは思いますが、何もできません)。新しく作成したオブジェクトにエントリがないようにコードを変更するだけなら、うまくいくはずです。 –

+0

あなたのコードを試しましたが、@ JonSkeetは正しいと思われます。リストでは、新しい値を追加するのに問題はありませんが、配列に次元を持たせると(簡単に)次元を変更することができないため、配列を再作成する必要があります。とにかく、デシリアライズされたときに新しいコレクションが登場すると思いますので、私には予想外の動作です。 – Pikoh

+0

シリアライザとデシリアライザは逆関数ではありません。シリアライザとデシリアライザは逆ではなく、バグとみなされますか? – Alexander

答えて

3

、あなたは部分的にこの動作を制御することができることを追加したいです(まあ、とにかくそれを再利用することはできません)。

デシリアライズ時に新しいコレクションが必要になると書いたので、それが役立つかもしれません。

+0

私はその設定を知らなかった、ありがとう – Pikoh

関連する問題