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
}
}