From f2aa4a2b40332d35d543b7a084fc429b2464d260 Mon Sep 17 00:00:00 2001 From: JamesNK Date: Sat, 2 Aug 2008 11:29:37 +0000 Subject: [PATCH] -Added missing files from Silverlight projects -Fixed JsonWriter depth error when writing current JsonReader position -Fixed JsonSerializer not fulling skipping properties when putting together constructor values -Changed JsonSerializer so that property names and constructor params matching is no longer case sensitive --- .../Properties/AssemblyInfo.cs | 37 +++++ .../Newtonsoft.Json.Tests.Silverlight.csproj | 133 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 35 +++++ .../SilverlightTests.cs | 18 +++ .../lib/nunit.framework.dll | Bin 0 -> 73728 bytes .../readme.txt | 22 +++ .../JsonSerializerTest.cs | 83 +++++++++++ Src/Newtonsoft.Json/JsonSerializer.cs | 8 +- Src/Newtonsoft.Json/JsonWriter.cs | 5 +- Src/Newtonsoft.Json/Utilities/StringUtils.cs | 20 +++ 10 files changed, 356 insertions(+), 5 deletions(-) create mode 100644 Src/Newtonsoft.Json.Silverlight/Properties/AssemblyInfo.cs create mode 100644 Src/Newtonsoft.Json.Tests.Silverlight/Newtonsoft.Json.Tests.Silverlight.csproj create mode 100644 Src/Newtonsoft.Json.Tests.Silverlight/Properties/AssemblyInfo.cs create mode 100644 Src/Newtonsoft.Json.Tests.Silverlight/SilverlightTests.cs create mode 100644 Src/Newtonsoft.Json.Tests.Silverlight/lib/nunit.framework.dll create mode 100644 Src/Newtonsoft.Json.Tests.Silverlight/readme.txt diff --git a/Src/Newtonsoft.Json.Silverlight/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Silverlight/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..4de3b9e1 --- /dev/null +++ b/Src/Newtonsoft.Json.Silverlight/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Newtonsoft.Json.Silverlight")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Newtonsoft.Json.Silverlight")] +[assembly: AssemblyCopyright("Copyright © 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: InternalsVisibleTo("Newtonsoft.Json.Tests.Silverlight")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("662ae5be-35c7-474d-8947-45dbd63b76dc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Src/Newtonsoft.Json.Tests.Silverlight/Newtonsoft.Json.Tests.Silverlight.csproj b/Src/Newtonsoft.Json.Tests.Silverlight/Newtonsoft.Json.Tests.Silverlight.csproj new file mode 100644 index 00000000..2bbef64b --- /dev/null +++ b/Src/Newtonsoft.Json.Tests.Silverlight/Newtonsoft.Json.Tests.Silverlight.csproj @@ -0,0 +1,133 @@ + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {0D8C3C2E-62C6-4C93-9377-6F74DD6BFD93} + {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Newtonsoft.Json.Tests.Silverlight + Newtonsoft.Json.Tests.Silverlight + v3.5 + false + + + true + full + false + ClientBin\ + DEBUG;TRACE;SILVERLIGHT + true + true + prompt + 4 + + + pdbonly + true + ClientBin\ + TRACE;SILVERLIGHT + true + true + prompt + 4 + + + + + True + + + True + + + True + + + + True + + + True + + + True + + + True + + + + + Converters\IsoDateTimeConverterTests.cs + + + Converters\JavaScriptDateTimeConverterTests.cs + + + Converters\XmlNodeConverterTest.cs + + + DateTimeTestClass.cs + + + JavaScriptConvertTest.cs + + + JsonSerializerTest.cs + + + JsonTextReaderTest.cs + + + JsonTextWriterTest.cs + + + JsonTokenReaderTest.cs + + + JsonTokenWriterTest.cs + + + Linq\JTokenTests.cs + + + Linq\JValueTests.cs + + + Linq\LinqToJsonTest.cs + + + TestFixtureBase.cs + + + + + + + + + + + {DC3C6F3D-2CA1-4278-9B79-63770FB3EA2D} + Newtonsoft.Json.Silverlight + + + + + + + + + + + + \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests.Silverlight/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests.Silverlight/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..597881f1 --- /dev/null +++ b/Src/Newtonsoft.Json.Tests.Silverlight/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Newtonsoft.Json.Tests.Silverlight")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Newtonsoft.Json.Tests.Silverlight")] +[assembly: AssemblyCopyright("Copyright © 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d4f36ccb-cde3-463c-9ef9-314f1e517610")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Src/Newtonsoft.Json.Tests.Silverlight/SilverlightTests.cs b/Src/Newtonsoft.Json.Tests.Silverlight/SilverlightTests.cs new file mode 100644 index 00000000..a0b7e3bb --- /dev/null +++ b/Src/Newtonsoft.Json.Tests.Silverlight/SilverlightTests.cs @@ -0,0 +1,18 @@ +using System; +using System.Reflection; +using NUnit.Framework; + +namespace SilverlightNUnitProject2 +{ + [TestFixture] + public class SilverlightTests + { + [Test] + public void SystemVersion() + { + Assembly systemAssembly = typeof(Uri).Assembly; + StringAssert.Contains("=2.0.5.0,", systemAssembly.FullName, + "Check we're testing a Silverlight 2.0 assembly"); + } + } +} diff --git a/Src/Newtonsoft.Json.Tests.Silverlight/lib/nunit.framework.dll b/Src/Newtonsoft.Json.Tests.Silverlight/lib/nunit.framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..d4e0b72ad1b6c1935b852a9881575cf3478d1c61 GIT binary patch literal 73728 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 NMj9At;Dgn`{{x*KB^Lky literal 0 HcmV?d00001 diff --git a/Src/Newtonsoft.Json.Tests.Silverlight/readme.txt b/Src/Newtonsoft.Json.Tests.Silverlight/readme.txt new file mode 100644 index 00000000..147624d3 --- /dev/null +++ b/Src/Newtonsoft.Json.Tests.Silverlight/readme.txt @@ -0,0 +1,22 @@ + +Silverlight NUnit Project Template +================================== + +NOTE: New references must be marked with... Copy Local: True. + +This project template is designed to work with TestDriven.Net 2.13 or greater. +http://www.testdriven.net/download.aspx + +To execute one or more unit tests use the 'Run Test(s)', 'Test With > Debugger' +or 'Test With > Coverage' commands. Tests will execute using the Silverlight +assemblies, but using the .NET 2.0 runtime. + +Individual methods can be executed using the Silverlight 2.0/CoreCLR runtime +using the 'Test With > silverlight' command. + +For more information see: +http://www.testdriven.net +http://weblogs.asp.net/nunitaddon + +Alternatively you can email: +Jamie Cansdale diff --git a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs index 304d685a..51211b00 100644 --- a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs @@ -1014,5 +1014,88 @@ keyword such as type of business."" Assert.AreEqual(0, c.IgnoredField); Assert.AreEqual(99, c.Field); } + +#if !SILVERLIGHT + [Test] + public void SerializeArrayAsArrayList() + { + string jsonText = @"[3, ""somestring"",[1,2,3]]"; + ArrayList o = JavaScriptConvert.DeserializeObject(jsonText); + + Assert.AreEqual(3, o.Count); + Assert.AreEqual(3, ((JArray)o[2]).Count); + } +#endif + + public class Name + { + public string personsName; + + public List pNumbers = new List(); + + public Name(string personsName) + { + this.personsName = personsName; + } + } + + public class PhoneNumber + { + public string phoneNumber; + + public PhoneNumber(string phoneNumber) + { + this.phoneNumber = phoneNumber; + } + } + + [Test] + public void SerializeMemberGenericList() + { + Name name = new Name("The Idiot in Next To Me"); + + PhoneNumber p1 = new PhoneNumber("555-1212"); + PhoneNumber p2 = new PhoneNumber("444-1212"); + + name.pNumbers.Add(p1); + name.pNumbers.Add(p2); + + string json = JavaScriptConvert.SerializeObject(name); + + Name newName = JavaScriptConvert.DeserializeObject(json); + + Assert.AreEqual("The Idiot in Next To Me", newName.personsName); + + // not passed in as part of the constructor, values not deserialized + Assert.AreEqual(0, newName.pNumbers.Count); + } + + public class ConstructorCaseSensitivityClass + { + public string param1 { get; set; } + public string Param1 { get; set; } + public string Param2 { get; set; } + + public ConstructorCaseSensitivityClass(string param1, string Param1, string param2) + { + this.param1 = param1; + this.Param1 = Param1; + this.Param2 = param2; + } + } + + [Test] + public void ConstructorCaseSensitivity() + { + ConstructorCaseSensitivityClass c = new ConstructorCaseSensitivityClass("param1", "Param1", "Param2"); + + string json = JavaScriptConvert.SerializeObject(c); + + ConstructorCaseSensitivityClass deserialized = JavaScriptConvert.DeserializeObject(json); + + Assert.AreEqual("param1", deserialized.param1); + Assert.AreEqual("Param1", deserialized.Param1); + Assert.AreEqual("Param2", deserialized.Param2); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JsonSerializer.cs b/Src/Newtonsoft.Json/JsonSerializer.cs index 3238a4d5..7f7640be 100644 --- a/Src/Newtonsoft.Json/JsonSerializer.cs +++ b/Src/Newtonsoft.Json/JsonSerializer.cs @@ -495,6 +495,7 @@ namespace Newtonsoft.Json if (c == null) throw new JsonSerializationException("Could not find a public constructor for type {0}.".FormatWith(CultureInfo.InvariantCulture, objectType)); + // create a dictionary to put retrieved values into IDictionary constructorParameters = c.GetParameters().ToDictionary(p => p, p => (object)null); bool exit = false; @@ -504,16 +505,15 @@ namespace Newtonsoft.Json { case JsonToken.PropertyName: string memberName = reader.Value.ToString(); - ParameterInfo matchingConstructorParameter = constructorParameters - .Where(kv => kv.Key.Name == memberName) - .Select(kv => kv.Key) - .SingleOrDefault(); + ParameterInfo matchingConstructorParameter = constructorParameters.ForgivingCaseSensitiveFind(kv => kv.Key.Name, memberName).Key; if (!reader.Read()) throw new JsonSerializationException("Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName)); if (matchingConstructorParameter != null) constructorParameters[matchingConstructorParameter] = CreateObject(reader, matchingConstructorParameter.ParameterType, null); + else + reader.Skip(); break; case JsonToken.EndObject: diff --git a/Src/Newtonsoft.Json/JsonWriter.cs b/Src/Newtonsoft.Json/JsonWriter.cs index 856c5957..7414cd82 100644 --- a/Src/Newtonsoft.Json/JsonWriter.cs +++ b/Src/Newtonsoft.Json/JsonWriter.cs @@ -367,7 +367,10 @@ namespace Newtonsoft.Json throw MiscellaneousUtils.CreateArgumentOutOfRangeException("TokenType", reader.TokenType, "Unexpected token type."); } } - while (reader.Read() && (currentDepth - 1 < reader.Depth || (currentDepth == reader.Depth && !IsEndToken(reader.TokenType)))); + while ( + // stop if we have reached the end of the token being read + currentDepth - 1 < reader.Depth - (IsEndToken(reader.TokenType) ? 1 : 0) + && reader.Read()); } private bool IsEndToken(JsonToken token) diff --git a/Src/Newtonsoft.Json/Utilities/StringUtils.cs b/Src/Newtonsoft.Json/Utilities/StringUtils.cs index afbc6beb..35d3cf18 100644 --- a/Src/Newtonsoft.Json/Utilities/StringUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/StringUtils.cs @@ -348,5 +348,25 @@ namespace Newtonsoft.Json.Utilities writer.Write(h3); writer.Write(h4); } + + public static TSource ForgivingCaseSensitiveFind(this IEnumerable source, Func valueSelector, string testValue) + { + if (source == null) + throw new ArgumentNullException("source"); + if (valueSelector == null) + throw new ArgumentNullException("valueSelector"); + + var caseInsensitiveResults = source.Where(s => string.Compare(valueSelector(s), testValue, StringComparison.OrdinalIgnoreCase) == 0); + if (caseInsensitiveResults.Count() <= 1) + { + return caseInsensitiveResults.SingleOrDefault(); + } + else + { + // multiple results returned. now filter using case sensitivity + var caseSensitiveResults = source.Where(s => string.Compare(valueSelector(s), testValue, StringComparison.Ordinal) == 0); + return caseSensitiveResults.SingleOrDefault(); + } + } } } \ No newline at end of file