From 803c381c72f19b7596172b1fcaaf53abd7e5d1f3 Mon Sep 17 00:00:00 2001 From: JamesNK Date: Thu, 15 Jan 2009 08:46:54 +0000 Subject: [PATCH] -Added deserialize test for jagged arrays -Made deserializer ignore missing members by default --- Src/Doc/SerializingJSON.html | 2 +- .../JsonSerializerTest.cs | 148 +++++++++++++++++- .../Newtonsoft.Json.Tests.Compact.csproj | 1 + .../Newtonsoft.Json.Tests.Silverlight.csproj | 1 + .../Newtonsoft.Json.Tests.csproj | 1 + .../TestObjects/JaggedArray.cs | 14 ++ Src/Newtonsoft.Json/JsonConvert.cs | 17 +- Src/Newtonsoft.Json/JsonSerializer.cs | 2 +- Src/Newtonsoft.Json/JsonSerializerSettings.cs | 2 +- Src/Newtonsoft.Json/MissingMemberHandling.cs | 10 +- 10 files changed, 187 insertions(+), 11 deletions(-) create mode 100644 Src/Newtonsoft.Json.Tests/TestObjects/JaggedArray.cs diff --git a/Src/Doc/SerializingJSON.html b/Src/Doc/SerializingJSON.html index 9307c5cb..6ca109c9 100644 --- a/Src/Doc/SerializingJSON.html +++ b/Src/Doc/SerializingJSON.html @@ -83,7 +83,7 @@ serialize.

MissingMemberHandling

Controls how missing members (e.g. JSON contains a property that isn't a member - on the object) are handled during deserialization. Error or ignore.

+ on the object) are handled during deserialization. Ignore or error.

NullValueHandling

Controls how null values are handled during serialization and deserialization. Include or ignore.

diff --git a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs index ed5a74e2..a9c95b33 100644 --- a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs @@ -424,7 +424,7 @@ keyword such as type of business."" // ] //} - ProductShort deserializedProductShort = (ProductShort)JsonConvert.DeserializeObject(output, typeof(ProductShort)); + ProductShort deserializedProductShort = (ProductShort)JsonConvert.DeserializeObject(output, typeof(ProductShort), new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error }); } [Test] @@ -1030,7 +1030,7 @@ keyword such as type of business."" { string json = @"{""Missing"":1}"; - JsonConvert.DeserializeObject(json); + JsonConvert.DeserializeObject(json, new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error }); } [Test] @@ -1081,5 +1081,149 @@ keyword such as type of business."" JsonConvert.DeserializeObject(json); } + + [Test] + public void SerializeJaggedArray() + { + JaggedArray aa = new JaggedArray(); + aa.Before = "Before!"; + aa.After = "After!"; + aa.Coordinates = new[] { new[] { 1, 1 }, new[] { 1, 2 }, new[] { 2, 1 }, new[] { 2, 2 } }; + + string json = JsonConvert.SerializeObject(aa); + + Assert.AreEqual(@"{""Before"":""Before!"",""Coordinates"":[[1,1],[1,2],[2,1],[2,2]],""After"":""After!""}", json); + } + + [Test] + public void DeserializeJaggedArray() + { + string json = @"{""Before"":""Before!"",""Coordinates"":[[1,1],[1,2],[2,1],[2,2]],""After"":""After!""}"; + + JaggedArray aa = JsonConvert.DeserializeObject(json); + + Assert.AreEqual("Before!", aa.Before); + Assert.AreEqual("After!", aa.After); + Assert.AreEqual(4, aa.Coordinates.Length); + Assert.AreEqual(2, aa.Coordinates[0].Length); + Assert.AreEqual(1, aa.Coordinates[0][0]); + Assert.AreEqual(2, aa.Coordinates[1][1]); + + string after = JsonConvert.SerializeObject(aa); + + Assert.AreEqual(json, after); + } + + public class GoogleMapGeocoderStructure + { + public string Name; + public Status Status; + public List Placemark; + } + + public class Status + { + public string Request; + public string Code; + } + + public class Placemark + { + public string Address; + public AddressDetails AddressDetails; + public Point Point; + } + + public class AddressDetails + { + public int Accuracy; + public Country Country; + } + + public class Country + { + public string CountryNameCode; + public AdministrativeArea AdministrativeArea; + } + + public class AdministrativeArea + { + public string AdministrativeAreaName; + public SubAdministrativeArea SubAdministrativeArea; + } + + public class SubAdministrativeArea + { + public string SubAdministrativeAreaName; + public Locality Locality; + } + + public class Locality + { + public string LocalityName; + public Thoroughfare Thoroughfare; + public PostalCode PostalCode; + } + + public class Thoroughfare + { + public string ThoroughfareName; + } + + public class PostalCode + { + public string PostalCodeNumber; + } + + public class Point + { + public List Coordinates; + } + + [Test] + public void DeserializeGoogleGeoCode() + { + string json = @"{ + ""name"": ""1600 Amphitheatre Parkway, Mountain View, CA, USA"", + ""Status"": { + ""code"": 200, + ""request"": ""geocode"" + }, + ""Placemark"": [ + { + ""address"": ""1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA"", + ""AddressDetails"": { + ""Country"": { + ""CountryNameCode"": ""US"", + ""AdministrativeArea"": { + ""AdministrativeAreaName"": ""CA"", + ""SubAdministrativeArea"": { + ""SubAdministrativeAreaName"": ""Santa Clara"", + ""Locality"": { + ""LocalityName"": ""Mountain View"", + ""Thoroughfare"": { + ""ThoroughfareName"": ""1600 Amphitheatre Pkwy"" + }, + ""PostalCode"": { + ""PostalCodeNumber"": ""94043"" + } + } + } + } + }, + ""Accuracy"": 8 + }, + ""Point"": { + ""coordinates"": [-122.083739, 37.423021, 0] + } + } + ] +}"; + + //JavaScriptSerializer serializer = new JavaScriptSerializer(); + //GoogleMapGeocoderStructure jsonGoogleMapGeocoder = serializer.Deserialize(json); + + GoogleMapGeocoderStructure jsonGoogleMapGeocoder = JsonConvert.DeserializeObject(json); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj index 009dff6d..8047b49b 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj @@ -78,6 +78,7 @@ + diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj index f5202b28..e72fba9e 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj @@ -83,6 +83,7 @@ + diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj index fd527a54..0625cd79 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.csproj @@ -100,6 +100,7 @@ + diff --git a/Src/Newtonsoft.Json.Tests/TestObjects/JaggedArray.cs b/Src/Newtonsoft.Json.Tests/TestObjects/JaggedArray.cs new file mode 100644 index 00000000..9f52e98c --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/TestObjects/JaggedArray.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Newtonsoft.Json.Tests.TestObjects +{ + public class JaggedArray + { + public string Before { get; set; } + public int[][] Coordinates { get; set; } + public string After { get; set; } + } +} \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JsonConvert.cs b/Src/Newtonsoft.Json/JsonConvert.cs index f0273eca..c2945d91 100644 --- a/Src/Newtonsoft.Json/JsonConvert.cs +++ b/Src/Newtonsoft.Json/JsonConvert.cs @@ -529,7 +529,7 @@ namespace Newtonsoft.Json /// The deserialized object from the Json string. public static T DeserializeObject(string value) { - return DeserializeObject(value, null); + return DeserializeObject(value, (JsonSerializerSettings)null); } /// @@ -560,6 +560,21 @@ namespace Newtonsoft.Json return (T)DeserializeObject(value, typeof(T), converters); } + /// + /// Deserializes the JSON string to the specified type. + /// + /// The type of the object to deserialize. + /// The object to deserialize. + /// + /// The used to deserialize the object. + /// If this is null, default serialization settings will be is used. + /// + /// The deserialized object from the JSON string. + public static T DeserializeObject(string value, JsonSerializerSettings settings) + { + return (T)DeserializeObject(value, typeof(T), settings); + } + /// /// Deserializes the JSON string to the specified type. /// diff --git a/Src/Newtonsoft.Json/JsonSerializer.cs b/Src/Newtonsoft.Json/JsonSerializer.cs index f3b02c95..92871ac7 100644 --- a/Src/Newtonsoft.Json/JsonSerializer.cs +++ b/Src/Newtonsoft.Json/JsonSerializer.cs @@ -77,7 +77,7 @@ namespace Newtonsoft.Json get { return _missingMemberHandling; } set { - if (value < MissingMemberHandling.Error || value > MissingMemberHandling.Ignore) + if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) throw new ArgumentOutOfRangeException("value"); _missingMemberHandling = value; diff --git a/Src/Newtonsoft.Json/JsonSerializerSettings.cs b/Src/Newtonsoft.Json/JsonSerializerSettings.cs index 08512b76..240ba76e 100644 --- a/Src/Newtonsoft.Json/JsonSerializerSettings.cs +++ b/Src/Newtonsoft.Json/JsonSerializerSettings.cs @@ -12,7 +12,7 @@ namespace Newtonsoft.Json public class JsonSerializerSettings { internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; - internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Error; + internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; diff --git a/Src/Newtonsoft.Json/MissingMemberHandling.cs b/Src/Newtonsoft.Json/MissingMemberHandling.cs index fe4d09b7..c7bd21db 100644 --- a/Src/Newtonsoft.Json/MissingMemberHandling.cs +++ b/Src/Newtonsoft.Json/MissingMemberHandling.cs @@ -34,13 +34,13 @@ namespace Newtonsoft.Json /// public enum MissingMemberHandling { - /// - /// Throw a when a missing member is encountered during deserialization. - /// - Error = 0, /// /// Ignore a missing member and do not attempt to deserialize it. /// - Ignore = 1 + Ignore = 0, + /// + /// Throw a when a missing member is encountered during deserialization. + /// + Error = 1 } }