Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/Newtonsoft.Json.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Src/Newtonsoft.Json.Tests/Converters/ExpandoObjectConverterTests.cs158
-rw-r--r--Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net35.csproj1
-rw-r--r--Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj1
-rw-r--r--Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WindowsPhone.csproj1
-rw-r--r--Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj1
-rw-r--r--Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs164
-rw-r--r--Src/Newtonsoft.Json/Bson/BsonReader.cs3
-rw-r--r--Src/Newtonsoft.Json/Bson/BsonWriter.cs3
-rw-r--r--Src/Newtonsoft.Json/Converters/ExpandoObjectConverter.cs140
-rw-r--r--Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj1
-rw-r--r--Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj1
-rw-r--r--Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj1
-rw-r--r--Src/Newtonsoft.Json/Newtonsoft.Json.csproj1
-rw-r--r--Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs3
-rw-r--r--Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs4
15 files changed, 415 insertions, 68 deletions
diff --git a/Src/Newtonsoft.Json.Tests/Converters/ExpandoObjectConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/ExpandoObjectConverterTests.cs
new file mode 100644
index 0000000..f07de57
--- /dev/null
+++ b/Src/Newtonsoft.Json.Tests/Converters/ExpandoObjectConverterTests.cs
@@ -0,0 +1,158 @@
+#if !(NET35 || NET20 || WINDOWS_PHONE)
+
+using System;
+using System.Collections.Generic;
+#if !SILVERLIGHT && !PocketPC && !NET20
+using System.Data.Linq;
+#endif
+#if !SILVERLIGHT
+using System.Data.SqlTypes;
+#endif
+using System.Dynamic;
+using System.Linq;
+using System.Text;
+using Newtonsoft.Json.Converters;
+using NUnit.Framework;
+using Newtonsoft.Json.Tests.TestObjects;
+
+namespace Newtonsoft.Json.Tests.Converters
+{
+ public class ExpandoObjectConverterTests : TestFixtureBase
+ {
+ public class ExpandoContainer
+ {
+ public string Before { get; set; }
+ public ExpandoObject Expando { get; set; }
+ public string After { get; set; }
+ }
+
+ [Test]
+ public void SerializeExpandoObject()
+ {
+ ExpandoContainer d = new ExpandoContainer
+ {
+ Before = "Before!",
+ Expando = new ExpandoObject(),
+ After = "After!"
+ };
+
+ dynamic o = d.Expando;
+
+ o.String = "String!";
+ o.Integer = 234;
+ o.Float = 1.23d;
+ o.List = new List<string> {"First", "Second", "Third"};
+ o.Object = new Dictionary<string, object>
+ {
+ {"First", 1}
+ };
+
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"{
+ ""Before"": ""Before!"",
+ ""Expando"": {
+ ""String"": ""String!"",
+ ""Integer"": 234,
+ ""Float"": 1.23,
+ ""List"": [
+ ""First"",
+ ""Second"",
+ ""Third""
+ ],
+ ""Object"": {
+ ""First"": 1
+ }
+ },
+ ""After"": ""After!""
+}", json);
+ }
+
+ [Test]
+ public void SerializeNullExpandoObject()
+ {
+ ExpandoContainer d = new ExpandoContainer();
+
+ string json = JsonConvert.SerializeObject(d, Formatting.Indented);
+
+ Assert.AreEqual(@"{
+ ""Before"": null,
+ ""Expando"": null,
+ ""After"": null
+}", json);
+ }
+
+ [Test]
+ public void DeserializeExpandoObject()
+ {
+ string json = @"{
+ ""Before"": ""Before!"",
+ ""Expando"": {
+ ""String"": ""String!"",
+ ""Integer"": 234,
+ ""Float"": 1.23,
+ ""List"": [
+ ""First"",
+ ""Second"",
+ ""Third""
+ ],
+ ""Object"": {
+ ""First"": 1
+ }
+ },
+ ""After"": ""After!""
+}";
+
+ ExpandoContainer o = JsonConvert.DeserializeObject<ExpandoContainer>(json);
+
+ Assert.AreEqual(o.Before, "Before!");
+ Assert.AreEqual(o.After, "After!");
+ Assert.IsNotNull(o.Expando);
+
+ dynamic d = o.Expando;
+ Assert.IsInstanceOfType(typeof(ExpandoObject), d);
+
+ Assert.AreEqual("String!", d.String);
+ Assert.IsInstanceOfType(typeof(string), d.String);
+
+ Assert.AreEqual(234, d.Integer);
+ Assert.IsInstanceOfType(typeof(long), d.Integer);
+
+ Assert.AreEqual(1.23, d.Float);
+ Assert.IsInstanceOfType(typeof(double), d.Float);
+
+ Assert.IsNotNull(d.List);
+ Assert.AreEqual(3, d.List.Count);
+ Assert.IsInstanceOfType(typeof(List<object>), d.List);
+
+ Assert.AreEqual("First", d.List[0]);
+ Assert.IsInstanceOfType(typeof(string), d.List[0]);
+
+ Assert.AreEqual("Second", d.List[1]);
+ Assert.AreEqual("Third", d.List[2]);
+
+ Assert.IsNotNull(d.Object);
+ Assert.IsInstanceOfType(typeof(ExpandoObject), d.Object);
+
+ Assert.AreEqual(1, d.Object.First);
+ Assert.IsInstanceOfType(typeof(long), d.Object.First);
+ }
+
+ [Test]
+ public void DeserializeNullExpandoObject()
+ {
+ string json = @"{
+ ""Before"": null,
+ ""Expando"": null,
+ ""After"": null
+}";
+
+ ExpandoContainer c = JsonConvert.DeserializeObject<ExpandoContainer>(json);
+
+ Assert.AreEqual(null, c.Expando);
+ }
+
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net35.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net35.csproj
index fd3f41f..39811c4 100644
--- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net35.csproj
+++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net35.csproj
@@ -107,6 +107,7 @@
<Compile Include="Bson\BsonWriterTests.cs" />
<Compile Include="Bson\BsonReaderTests.cs" />
<Compile Include="Converters\BinaryConverterTests.cs" />
+ <Compile Include="Converters\ExpandoObjectConverterTests.cs" />
<Compile Include="Converters\RegexConverterTests.cs" />
<Compile Include="Converters\DataTableConverterTests.cs" />
<Compile Include="Converters\DataSetConverterTests.cs" />
diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj
index 325ae31..fe13d1a 100644
--- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj
+++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj
@@ -106,6 +106,7 @@
<Compile Include="Converters\CustomCreationConverterTests.cs" />
<Compile Include="Converters\DataSetConverterTests.cs" />
<Compile Include="Converters\DataTableConverterTests.cs" />
+ <Compile Include="Converters\ExpandoObjectConverterTests.cs" />
<Compile Include="Converters\ObjectIdConverterTests.cs" />
<Compile Include="Converters\RegexConverterTests.cs" />
<Compile Include="Converters\StringEnumConverterTests.cs" />
diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WindowsPhone.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WindowsPhone.csproj
index c0d05f9..05a8905 100644
--- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WindowsPhone.csproj
+++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WindowsPhone.csproj
@@ -70,6 +70,7 @@
<Compile Include="Converters\CustomCreationConverterTests.cs" />
<Compile Include="Converters\DataSetConverterTests.cs" />
<Compile Include="Converters\DataTableConverterTests.cs" />
+ <Compile Include="Converters\ExpandoObjectConverterTests.cs" />
<Compile Include="Converters\ObjectIdConverterTests.cs" />
<Compile Include="Converters\RegexConverterTests.cs" />
<Compile Include="Converters\StringEnumConverterTests.cs" />
diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj
index fc75f49..151824d 100644
--- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj
+++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj
@@ -108,6 +108,7 @@
<Compile Include="Bson\BsonWriterTests.cs" />
<Compile Include="Bson\BsonReaderTests.cs" />
<Compile Include="Converters\BinaryConverterTests.cs" />
+ <Compile Include="Converters\ExpandoObjectConverterTests.cs" />
<Compile Include="Converters\RegexConverterTests.cs" />
<Compile Include="Converters\DataTableConverterTests.cs" />
<Compile Include="Converters\DataSetConverterTests.cs" />
diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs
index 3042e73..0a8d7bb 100644
--- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs
+++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs
@@ -27,6 +27,7 @@ using System;
using System.Collections.Generic;
#if !SILVERLIGHT && !PocketPC && !NET20
using System.ComponentModel.DataAnnotations;
+using System.Configuration;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Web.Script.Serialization;
@@ -3448,45 +3449,45 @@ keyword such as type of business.""
Assert.AreEqual(27, deserialized.Age);
}
-// [Test]
-// public void XmlSerializerSpecifiedTrueTest()
-// {
-// XmlSerializer s = new XmlSerializer(typeof(OptionalOrder));
+ // [Test]
+ // public void XmlSerializerSpecifiedTrueTest()
+ // {
+ // XmlSerializer s = new XmlSerializer(typeof(OptionalOrder));
-// StringWriter sw = new StringWriter();
-// s.Serialize(sw, new OptionalOrder() { FirstOrder = "First", FirstOrderSpecified = true });
+ // StringWriter sw = new StringWriter();
+ // s.Serialize(sw, new OptionalOrder() { FirstOrder = "First", FirstOrderSpecified = true });
-// Console.WriteLine(sw.ToString());
+ // Console.WriteLine(sw.ToString());
-// string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
-//<OptionalOrder xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
-// <FirstOrder>First</FirstOrder>
-//</OptionalOrder>";
+ // string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
+ //<OptionalOrder xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
+ // <FirstOrder>First</FirstOrder>
+ //</OptionalOrder>";
-// OptionalOrder o = (OptionalOrder)s.Deserialize(new StringReader(xml));
-// Console.WriteLine(o.FirstOrder);
-// Console.WriteLine(o.FirstOrderSpecified);
-// }
+ // OptionalOrder o = (OptionalOrder)s.Deserialize(new StringReader(xml));
+ // Console.WriteLine(o.FirstOrder);
+ // Console.WriteLine(o.FirstOrderSpecified);
+ // }
-// [Test]
-// public void XmlSerializerSpecifiedFalseTest()
-// {
-// XmlSerializer s = new XmlSerializer(typeof(OptionalOrder));
+ // [Test]
+ // public void XmlSerializerSpecifiedFalseTest()
+ // {
+ // XmlSerializer s = new XmlSerializer(typeof(OptionalOrder));
-// StringWriter sw = new StringWriter();
-// s.Serialize(sw, new OptionalOrder() { FirstOrder = "First", FirstOrderSpecified = false });
+ // StringWriter sw = new StringWriter();
+ // s.Serialize(sw, new OptionalOrder() { FirstOrder = "First", FirstOrderSpecified = false });
-// Console.WriteLine(sw.ToString());
+ // Console.WriteLine(sw.ToString());
-// // string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
-// //<OptionalOrder xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
-// // <FirstOrder>First</FirstOrder>
-// //</OptionalOrder>";
+ // // string xml = @"<?xml version=""1.0"" encoding=""utf-16""?>
+ // //<OptionalOrder xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
+ // // <FirstOrder>First</FirstOrder>
+ // //</OptionalOrder>";
-// // OptionalOrder o = (OptionalOrder)s.Deserialize(new StringReader(xml));
-// // Console.WriteLine(o.FirstOrder);
-// // Console.WriteLine(o.FirstOrderSpecified);
-// }
+ // // OptionalOrder o = (OptionalOrder)s.Deserialize(new StringReader(xml));
+ // // Console.WriteLine(o.FirstOrder);
+ // // Console.WriteLine(o.FirstOrderSpecified);
+ // }
public class OptionalOrder
{
@@ -3501,47 +3502,47 @@ keyword such as type of business.""
public class FamilyDetails
{
- public string Name { get; set; }
- public int NumberOfChildren { get; set; }
+ public string Name { get; set; }
+ public int NumberOfChildren { get; set; }
- [JsonIgnore]
- public bool NumberOfChildrenSpecified { get; set; }
+ [JsonIgnore]
+ public bool NumberOfChildrenSpecified { get; set; }
}
[Test]
public void SpecifiedExample()
{
- FamilyDetails joe = new FamilyDetails();
- joe.Name = "Joe Family Details";
- joe.NumberOfChildren = 4;
- joe.NumberOfChildrenSpecified = true;
+ FamilyDetails joe = new FamilyDetails();
+ joe.Name = "Joe Family Details";
+ joe.NumberOfChildren = 4;
+ joe.NumberOfChildrenSpecified = true;
- FamilyDetails martha = new FamilyDetails();
- martha.Name = "Martha Family Details";
- martha.NumberOfChildren = 3;
- martha.NumberOfChildrenSpecified = false;
+ FamilyDetails martha = new FamilyDetails();
+ martha.Name = "Martha Family Details";
+ martha.NumberOfChildren = 3;
+ martha.NumberOfChildrenSpecified = false;
- string json = JsonConvert.SerializeObject(new[] { joe, martha }, Formatting.Indented);
- //[
- // {
- // "Name": "Joe Family Details",
- // "NumberOfChildren": 4
- // },
- // {
- // "Name": "Martha Family Details"
- // }
- //]
- Console.WriteLine(json);
+ string json = JsonConvert.SerializeObject(new[] { joe, martha }, Formatting.Indented);
+ //[
+ // {
+ // "Name": "Joe Family Details",
+ // "NumberOfChildren": 4
+ // },
+ // {
+ // "Name": "Martha Family Details"
+ // }
+ //]
+ Console.WriteLine(json);
- string mikeString = "{\"Name\": \"Mike Person\"}";
- FamilyDetails mike = JsonConvert.DeserializeObject<FamilyDetails>(mikeString);
+ string mikeString = "{\"Name\": \"Mike Person\"}";
+ FamilyDetails mike = JsonConvert.DeserializeObject<FamilyDetails>(mikeString);
- Console.WriteLine("mikeString specifies number of children: {0}", mike.NumberOfChildrenSpecified);
+ Console.WriteLine("mikeString specifies number of children: {0}", mike.NumberOfChildrenSpecified);
- string mikeFullDisclosureString = "{\"Name\": \"Mike Person\", \"NumberOfChildren\": \"0\"}";
- mike = JsonConvert.DeserializeObject<FamilyDetails>(mikeFullDisclosureString);
+ string mikeFullDisclosureString = "{\"Name\": \"Mike Person\", \"NumberOfChildren\": \"0\"}";
+ mike = JsonConvert.DeserializeObject<FamilyDetails>(mikeFullDisclosureString);
- Console.WriteLine("mikeString specifies number of children: {0}", mike.NumberOfChildrenSpecified);
+ Console.WriteLine("mikeString specifies number of children: {0}", mike.NumberOfChildrenSpecified);
}
public class DictionaryKey
@@ -3783,14 +3784,14 @@ keyword such as type of business.""
Assert.IsInstanceOfType(typeof(double), newExpando["Decimal"]);
Assert.AreEqual(expando.Decimal, newExpando["Decimal"]);
- Assert.IsInstanceOfType(typeof(JObject), newExpando["Complex"]);
- JObject o = (JObject)newExpando["Complex"];
+ Assert.IsInstanceOfType(typeof(ExpandoObject), newExpando["Complex"]);
+ IDictionary<string, object> o = (ExpandoObject)newExpando["Complex"];
- Assert.IsInstanceOfType(typeof(string), ((JValue)o["String"]).Value);
- Assert.AreEqual(expando.Complex.String, (string)o["String"]);
+ Assert.IsInstanceOfType(typeof(string), o["String"]);
+ Assert.AreEqual(expando.Complex.String, o["String"]);
- Assert.IsInstanceOfType(typeof(DateTime), ((JValue)o["DateTime"]).Value);
- Assert.AreEqual(expando.Complex.DateTime, (DateTime)o["DateTime"]);
+ Assert.IsInstanceOfType(typeof(DateTime), o["DateTime"]);
+ Assert.AreEqual(expando.Complex.DateTime, o["DateTime"]);
}
#endif
@@ -4074,7 +4075,7 @@ keyword such as type of business.""
{
public string Value { get; private set; }
public string Constructor { get; private set; }
-
+
public PublicConstructorOverridenByJsonConstructor()
{
Constructor = "NonPublic";
@@ -4107,7 +4108,7 @@ keyword such as type of business.""
Value = value;
Constructor = "Public Paramatized 1";
}
-
+
[JsonConstructor]
public MultipleParamatrizedConstructorsJsonConstructor(string value, int age)
{
@@ -4218,5 +4219,34 @@ keyword such as type of business.""
Assert.IsNull(dateTime);
}
+
+ [Test]
+ public void MultiIndexSuperTest()
+ {
+ MultiIndexSuper e = new MultiIndexSuper();
+
+ string json = JsonConvert.SerializeObject(e, Formatting.Indented);
+
+ Assert.AreEqual(@"{}", json);
+ }
+
+ public class MultiIndexSuper : MultiIndexBase
+ {
+
+ }
+
+ public abstract class MultiIndexBase
+ {
+ protected internal object this[string propertyName]
+ {
+ get { return null; }
+ set { }
+ }
+ protected internal object this[object property]
+ {
+ get { return null; }
+ set { }
+ }
+ }
}
} \ No newline at end of file
diff --git a/Src/Newtonsoft.Json/Bson/BsonReader.cs b/Src/Newtonsoft.Json/Bson/BsonReader.cs
index fa18d61..83ad3cb 100644
--- a/Src/Newtonsoft.Json/Bson/BsonReader.cs
+++ b/Src/Newtonsoft.Json/Bson/BsonReader.cs
@@ -242,6 +242,9 @@ namespace Newtonsoft.Json.Bson
}
}
+ /// <summary>
+ /// Changes the <see cref="JsonReader.State"/> to Closed.
+ /// </summary>
public override void Close()
{
base.Close();
diff --git a/Src/Newtonsoft.Json/Bson/BsonWriter.cs b/Src/Newtonsoft.Json/Bson/BsonWriter.cs
index 4260c90..7975070 100644
--- a/Src/Newtonsoft.Json/Bson/BsonWriter.cs
+++ b/Src/Newtonsoft.Json/Bson/BsonWriter.cs
@@ -156,6 +156,9 @@ namespace Newtonsoft.Json.Bson
_propertyName = name;
}
+ /// <summary>
+ /// Closes this stream and the underlying stream.
+ /// </summary>
public override void Close()
{
base.Close();
diff --git a/Src/Newtonsoft.Json/Converters/ExpandoObjectConverter.cs b/Src/Newtonsoft.Json/Converters/ExpandoObjectConverter.cs
new file mode 100644
index 0000000..5d88542
--- /dev/null
+++ b/Src/Newtonsoft.Json/Converters/ExpandoObjectConverter.cs
@@ -0,0 +1,140 @@
+#if !(NET35 || NET20 || WINDOWS_PHONE)
+
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using Newtonsoft.Json.Utilities;
+
+namespace Newtonsoft.Json.Converters
+{
+ /// <summary>
+ /// Converts an ExpandoObject to and from JSON.
+ /// </summary>
+ public class ExpandoObjectConverter : JsonConverter
+ {
+ /// <summary>
+ /// Writes the JSON representation of the object.
+ /// </summary>
+ /// <param name="writer">The <see cref="JsonWriter"/> to write to.</param>
+ /// <param name="value">The value.</param>
+ /// <param name="serializer">The calling serializer.</param>
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ // can write is set to false
+ }
+
+ /// <summary>
+ /// Reads the JSON representation of the object.
+ /// </summary>
+ /// <param name="reader">The <see cref="JsonReader"/> to read from.</param>
+ /// <param name="objectType">Type of the object.</param>
+ /// <param name="existingValue">The existing value of object being read.</param>
+ /// <param name="serializer">The calling serializer.</param>
+ /// <returns>The object value.</returns>
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ return ReadValue(reader);
+ }
+
+ private object ReadValue(JsonReader reader)
+ {
+ while (reader.TokenType == JsonToken.Comment)
+ {
+ if (!reader.Read())
+ throw new Exception("Unexpected end.");
+ }
+
+ switch (reader.TokenType)
+ {
+ case JsonToken.StartObject:
+ return ReadObject(reader);
+ case JsonToken.StartArray:
+ return ReadList(reader);
+ default:
+ if (JsonReader.IsPrimitiveToken(reader.TokenType))
+ return reader.Value;
+
+ throw new Exception("Unexpected token when converting ExpandoObject: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType));
+ }
+ }
+
+ private object ReadList(JsonReader reader)
+ {
+ IList<object> list = new List<object>();
+
+ while (reader.Read())
+ {
+ switch (reader.TokenType)
+ {
+ case JsonToken.Comment:
+ break;
+ default:
+ object v = ReadValue(reader);
+
+ list.Add(v);
+ break;
+ case JsonToken.EndArray:
+ return list;
+ }
+ }
+
+ throw new Exception("Unexpected end.");
+ }
+
+ private object ReadObject(JsonReader reader)
+ {
+ IDictionary<string, object> expandoObject = new ExpandoObject();
+
+ while (reader.Read())
+ {
+ switch (reader.TokenType)
+ {
+ case JsonToken.PropertyName:
+ string propertyName = reader.Value.ToString();
+
+ if (!reader.Read())
+ throw new Exception("Unexpected end.");
+
+ object v = ReadValue(reader);
+
+ expandoObject[propertyName] = v;
+ break;
+ case JsonToken.Comment:
+ break;
+ case JsonToken.EndObject:
+ return expandoObject;
+ }
+ }
+
+ throw new Exception("Unexpected end.");
+ }
+
+ /// <summary>
+ /// Determines whether this instance can convert the specified object type.
+ /// </summary>
+ /// <param name="objectType">Type of the object.</param>
+ /// <returns>
+ /// <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
+ /// </returns>
+ public override bool CanConvert(Type objectType)
+ {
+ return (objectType == typeof (ExpandoObject));
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether this <see cref="JsonConverter"/> can write JSON.
+ /// </summary>
+ /// <value>
+ /// <c>true</c> if this <see cref="JsonConverter"/> can write JSON; otherwise, <c>false</c>.
+ /// </value>
+ public override bool CanWrite
+ {
+ get { return false; }
+ }
+ }
+}
+
+#endif \ No newline at end of file
diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj
index 3c7fe56..7e590cc 100644
--- a/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj
+++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Net35.csproj
@@ -97,6 +97,7 @@
<Compile Include="Converters\CustomCreationConverter.cs" />
<Compile Include="Converters\DateTimeConverterBase.cs" />
<Compile Include="Converters\EntityKeyMemberConverter.cs" />
+ <Compile Include="Converters\ExpandoObjectConverter.cs" />
<Compile Include="Converters\KeyValuePairConverter.cs" />
<Compile Include="Converters\BsonObjectIdConverter.cs" />
<Compile Include="Converters\RegexConverter.cs" />
diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj
index 4a8cd1f..54f5f07 100644
--- a/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj
+++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj
@@ -95,6 +95,7 @@
<Compile Include="Converters\DataTableConverter.cs" />
<Compile Include="Converters\DateTimeConverterBase.cs" />
<Compile Include="Converters\EntityKeyMemberConverter.cs" />
+ <Compile Include="Converters\ExpandoObjectConverter.cs" />
<Compile Include="Converters\IsoDateTimeConverter.cs" />
<Compile Include="Converters\JavaScriptDateTimeConverter.cs" />
<Compile Include="Converters\JsonDateTimeSerializationMode.cs" />
diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj
index 4e194ce..0ef846e 100644
--- a/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj
+++ b/Src/Newtonsoft.Json/Newtonsoft.Json.WindowsPhone.csproj
@@ -68,6 +68,7 @@
<Compile Include="Converters\DataTableConverter.cs" />
<Compile Include="Converters\DateTimeConverterBase.cs" />
<Compile Include="Converters\EntityKeyMemberConverter.cs" />
+ <Compile Include="Converters\ExpandoObjectConverter.cs" />
<Compile Include="Converters\IsoDateTimeConverter.cs" />
<Compile Include="Converters\JavaScriptDateTimeConverter.cs" />
<Compile Include="Converters\JsonDateTimeSerializationMode.cs" />
diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.csproj
index 2959062..3f6d026 100644
--- a/Src/Newtonsoft.Json/Newtonsoft.Json.csproj
+++ b/Src/Newtonsoft.Json/Newtonsoft.Json.csproj
@@ -96,6 +96,7 @@
<Compile Include="Converters\CustomCreationConverter.cs" />
<Compile Include="Converters\DateTimeConverterBase.cs" />
<Compile Include="Converters\EntityKeyMemberConverter.cs" />
+ <Compile Include="Converters\ExpandoObjectConverter.cs" />
<Compile Include="Converters\KeyValuePairConverter.cs" />
<Compile Include="Converters\BsonObjectIdConverter.cs" />
<Compile Include="Converters\RegexConverter.cs" />
diff --git a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs
index dc23e38..c93ffa3 100644
--- a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs
+++ b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs
@@ -84,6 +84,9 @@ namespace Newtonsoft.Json.Serialization
#if !PocketPC && !SILVERLIGHT && !NET20
new EntityKeyMemberConverter(),
#endif
+#if !(NET35 || NET20 || WINDOWS_PHONE)
+ new ExpandoObjectConverter(),
+#endif
new BinaryConverter(),
new KeyValuePairConverter(),
#if !SILVERLIGHT || WINDOWS_PHONE
diff --git a/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs b/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs
index d5f557a..69a1571 100644
--- a/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs
+++ b/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs
@@ -896,7 +896,9 @@ namespace Newtonsoft.Json.Utilities
PropertyInfo member = propertyInfos[i];
if (member.DeclaringType != targetType)
{
- PropertyInfo declaredMember = member.DeclaringType.GetProperty(member.Name, bindingAttr);
+ Type[] types = member.GetIndexParameters().Select(p => p.ParameterType).ToArray();
+
+ PropertyInfo declaredMember = member.DeclaringType.GetProperty(member.Name, bindingAttr, null, member.PropertyType, types, null);
propertyInfos[i] = declaredMember;
}
}