title: Newtonsoft Json Deserialize Dictionary as Key/Value list from DataContractJsonSerializer
body: <p>I have a dictionary serialized to storage with DataContractJsonSerializer which I would like to deserialize with Newtonsoft.Json.</p>
  
  <p>The DataContractJsonSerializer has serialized the Dictionary to a list of Key/Value pairs:</p>
  
  <pre><code>{"Dict":[{"Key":"Key1","Value":"Val1"},{"Key":"Key2","Value":"Val2"}]}
  </code></pre>
  
  <p>Is there any cool options I can give the <code>JsonConvert.DeserializeObject&lt;&gt;()</code> that will make it support both that data format and the format from Newtonsoft.Json?</p>
  
  <pre><code>{"Dict":{"Key1":"Val1","Key2":"Val2"}}
  </code></pre>
  
  <p>Is the pretty format Newtonsoft.Json creates, and I would like to be able to read both the old DataContract format and the new Newtonsoft format in a transition period.</p>
  
  <p>Simplified example:</p>
  
  <pre><code>    //[JsonArray]
      public sealed class Data
      {
          public IDictionary&lt;string, string&gt; Dict { get; set; }
      }
  
      [TestMethod]
      public void TestSerializeDataContractDeserializeNewtonsoftDictionary()
      {
          var d = new Data
          {
              Dict = new Dictionary&lt;string, string&gt;
              {
                  {"Key1", "Val1"},
                  {"Key2", "Val2"},
              }
          };
  
          var oldJson = String.Empty;
          var formatter = new DataContractJsonSerializer(typeof (Data));
          using (var stream = new MemoryStream())
          {
              formatter.WriteObject(stream, d);
              oldJson = Encoding.UTF8.GetString(stream.ToArray());
          }
  
          var newJson = JsonConvert.SerializeObject(d);
          // [JsonArray] on Data class gives:
          //
          // System.InvalidCastException: Unable to cast object of type 'Data' to type 'System.Collections.IEnumerable'.
  
          Console.WriteLine(oldJson);
          // This is tha data I have in storage and want to deserialize with Newtonsoft.Json, an array of key/value pairs
          // {"Dict":[{"Key":"Key1","Value":"Val1"},{"Key":"Key2","Value":"Val2"}]}
  
          Console.WriteLine(newJson);
          // This is what Newtonsoft.Json generates and should also be supported:
          // {"Dict":{"Key1":"Val1","Key2":"Val2"}}
  
          var d2 = JsonConvert.DeserializeObject&lt;Data&gt;(newJson);
          Assert.AreEqual("Val1", d2.Dict["Key1"]);
          Assert.AreEqual("Val2", d2.Dict["Key2"]);
  
          var d3 = JsonConvert.DeserializeObject&lt;Data&gt;(oldJson);
          // Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into 
          // type 'System.Collections.Generic.IDictionary`2[System.String,System.String]' because the type requires a JSON 
          // object (e.g. {"name":"value"}) to deserialize correctly.
          //
          // To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type
          // to an array or a type that implements a collection interface (e.g. ICollection, IList) like List&lt;T&gt; that can be 
          // deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from
          // a JSON array.
          //
          // Path 'Dict', line 1, position 9.
  
          Assert.AreEqual("Val1", d3.Dict["Key1"]);
          Assert.AreEqual("Val2", d3.Dict["Key2"]);
      }
  </code></pre>