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
、:ジョンスキートのコメントに加えて
(それができるので)リストに追加しているように聞こえますが、配列全体が置き換えられます(元の値をコピーできるとは思いますが、何もできません)。新しく作成したオブジェクトにエントリがないようにコードを変更するだけなら、うまくいくはずです。 –
あなたのコードを試しましたが、@ JonSkeetは正しいと思われます。リストでは、新しい値を追加するのに問題はありませんが、配列に次元を持たせると(簡単に)次元を変更することができないため、配列を再作成する必要があります。とにかく、デシリアライズされたときに新しいコレクションが登場すると思いますので、私には予想外の動作です。 – Pikoh
シリアライザとデシリアライザは逆関数ではありません。シリアライザとデシリアライザは逆ではなく、バグとみなされますか? – Alexander