diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
index e0156daa..9b3ef943 100644
--- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
+++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
@@ -25,6 +25,7 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Text;
using NUnit.Framework;
using Newtonsoft.Json;
@@ -799,6 +800,78 @@ bye", reader.Value);
Assert.IsTrue(reader.Read());
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
}
+
+ [Test]
+ public void ReadAsDateTimeOffsetIsoDate()
+ {
+ string json = @"{""Offset"":""2011-08-01T21:25Z""}";
+
+ JsonTextReader reader = new JsonTextReader(new StringReader(json));
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
+
+ reader.ReadAsDateTimeOffset();
+ Assert.AreEqual(JsonToken.Date, reader.TokenType);
+ Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
+ Assert.AreEqual(new DateTimeOffset(new DateTime(2011, 8, 1, 21, 25, 0, DateTimeKind.Utc), TimeSpan.Zero), reader.Value);
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
+ }
+
+ [Test]
+ public void ReadAsDateTimeOffsetUnitedStatesDate()
+ {
+ string json = @"{""Offset"":""1/30/2011""}";
+
+ JsonTextReader reader = new JsonTextReader(new StringReader(json));
+ reader.Culture = new CultureInfo("en-US");
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
+
+ reader.ReadAsDateTimeOffset();
+ Assert.AreEqual(JsonToken.Date, reader.TokenType);
+ Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
+
+ DateTimeOffset dt = (DateTimeOffset)reader.Value;
+ Assert.AreEqual(new DateTime(2011, 1, 30, 0, 0, 0, DateTimeKind.Unspecified), dt.DateTime);
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
+ }
+
+ [Test]
+ public void ReadAsDateTimeOffsetNewZealandDate()
+ {
+ string json = @"{""Offset"":""30/1/2011""}";
+
+ JsonTextReader reader = new JsonTextReader(new StringReader(json));
+ reader.Culture = new CultureInfo("en-NZ");
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
+
+ reader.ReadAsDateTimeOffset();
+ Assert.AreEqual(JsonToken.Date, reader.TokenType);
+ Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
+
+ DateTimeOffset dt = (DateTimeOffset)reader.Value;
+ Assert.AreEqual(new DateTime(2011, 1, 30, 0, 0, 0, DateTimeKind.Unspecified), dt.DateTime);
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
+ }
#endif
[Test]
@@ -822,5 +895,28 @@ bye", reader.Value);
Assert.IsTrue(reader.Read());
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
}
+
+ [Test]
+ public void ReadAsDecimalFrench()
+ {
+ string json = @"{""decimal"":""9,99""}";
+
+ JsonTextReader reader = new JsonTextReader(new StringReader(json));
+ reader.Culture = new CultureInfo("fr-FR");
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
+
+ decimal? d = reader.ReadAsDecimal();
+ Assert.AreEqual(JsonToken.Float, reader.TokenType);
+ Assert.AreEqual(typeof(decimal), reader.ValueType);
+ Assert.AreEqual(9.99m, d);
+
+ Assert.IsTrue(reader.Read());
+ Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
+ }
}
}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs
index b458d0ea..bb553a27 100644
--- a/Src/Newtonsoft.Json/JsonTextReader.cs
+++ b/Src/Newtonsoft.Json/JsonTextReader.cs
@@ -55,6 +55,16 @@ namespace Newtonsoft.Json
private int _currentLineNumber;
private bool _end;
private ReadType _readType;
+ private CultureInfo _culture;
+
+ ///
+ /// Gets or sets the culture used when reading JSON. Defaults to .
+ ///
+ public CultureInfo Culture
+ {
+ get { return _culture ?? CultureInfo.CurrentCulture; }
+ set { _culture = value; }
+ }
///
/// Initializes a new instance of the class with the specified .
@@ -357,7 +367,7 @@ namespace Newtonsoft.Json
return (decimal?)Value;
decimal d;
- if (TokenType == JsonToken.String && decimal.TryParse((string)Value, NumberStyles.Number, CultureInfo.InvariantCulture, out d))
+ if (TokenType == JsonToken.String && decimal.TryParse((string)Value, NumberStyles.Number, Culture, out d))
{
SetToken(JsonToken.Float, d);
return d;
@@ -386,6 +396,13 @@ namespace Newtonsoft.Json
if (TokenType == JsonToken.Date)
return (DateTimeOffset)Value;
+ DateTimeOffset dt;
+ if (TokenType == JsonToken.String && DateTimeOffset.TryParse((string)Value, Culture, DateTimeStyles.None, out dt))
+ {
+ SetToken(JsonToken.Date, dt);
+ return dt;
+ }
+
throw CreateJsonReaderException("Unexpected token when reading date: {0}. Line {1}, position {2}.", TokenType, _currentLineNumber, _currentLinePosition);
}
#endif