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:
authorJamesNK <james@newtonking.com>2010-01-23 01:17:56 +0300
committerJamesNK <james@newtonking.com>2010-01-23 01:17:56 +0300
commitbe6ed7daaae9804a50914b5702adc9301361f28a (patch)
tree8e0d4dd1e7174fcd72f422e48d0f3bb2d7686193
parent621916f5a6d1f6cf234bf7baa2f23b75ee279d01 (diff)
-Added ReadRootValueAsArray, DateTimeKindHandling properties to BsonReader
-Included BSON is .NET 2.0, Silverlight and Compact Framework builds
-rw-r--r--Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs49
-rw-r--r--Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs3
-rw-r--r--Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj2
-rw-r--r--Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj2
-rw-r--r--Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj2
-rw-r--r--Src/Newtonsoft.Json/Bson/BsonReader.cs60
-rw-r--r--Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj4
-rw-r--r--Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj4
-rw-r--r--Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj4
9 files changed, 117 insertions, 13 deletions
diff --git a/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs b/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs
index e23c8a3..f826278 100644
--- a/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Bson/BsonReaderTests.cs
@@ -117,7 +117,16 @@ namespace Newtonsoft.Json.Tests.Bson
byte[] data = MiscellaneousUtils.HexToBytes("20-00-00-00-02-30-00-02-00-00-00-61-00-02-31-00-02-00-00-00-62-00-02-32-00-02-00-00-00-63-00-00");
MemoryStream ms = new MemoryStream(data);
- BsonReader reader = new BsonReader(ms, true);
+ BsonReader reader = new BsonReader(ms);
+
+ Assert.AreEqual(false, reader.ReadRootValueAsArray);
+ Assert.AreEqual(DateTimeKind.Local, reader.DateTimeKindHandling);
+
+ reader.ReadRootValueAsArray = true;
+ reader.DateTimeKindHandling = DateTimeKind.Utc;
+
+ Assert.AreEqual(true, reader.ReadRootValueAsArray);
+ Assert.AreEqual(DateTimeKind.Utc, reader.DateTimeKindHandling);
Assert.IsTrue(reader.Read());
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
@@ -149,7 +158,10 @@ namespace Newtonsoft.Json.Tests.Bson
byte[] data = MiscellaneousUtils.HexToBytes("2B-00-00-00-02-30-00-02-00-00-00-61-00-02-31-00-02-00-00-00-62-00-05-32-00-0C-00-00-00-02-48-65-6C-6C-6F-20-77-6F-72-6C-64-21-00");
MemoryStream ms = new MemoryStream(data);
- BsonReader reader = new BsonReader(ms, true);
+ BsonReader reader = new BsonReader(ms, true, DateTimeKind.Utc);
+
+ Assert.AreEqual(true, reader.ReadRootValueAsArray);
+ Assert.AreEqual(DateTimeKind.Utc, reader.DateTimeKindHandling);
Assert.IsTrue(reader.Read());
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
@@ -175,7 +187,7 @@ namespace Newtonsoft.Json.Tests.Bson
Assert.IsFalse(reader.Read());
- string decodedString = Encoding.UTF8.GetString(encodedStringData);
+ string decodedString = Encoding.UTF8.GetString(encodedStringData, 0, encodedStringData.Length);
Assert.AreEqual("Hello world!", decodedString);
}
@@ -646,5 +658,36 @@ namespace Newtonsoft.Json.Tests.Bson
Assert.IsFalse(reader.Read());
}
+
+ [Test]
+ public void DateTimeKindHandling()
+ {
+ DateTime value = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc);
+
+ MemoryStream ms = new MemoryStream();
+ BsonWriter writer = new BsonWriter(ms);
+
+ writer.WriteStartObject();
+ writer.WritePropertyName("DateTime");
+ writer.WriteValue(value);
+ writer.WriteEndObject();
+
+ byte[] bson = ms.ToArray();
+
+ JObject o;
+ BsonReader reader;
+
+ reader = new BsonReader(new MemoryStream(bson), false, DateTimeKind.Utc);
+ o = (JObject)JToken.ReadFrom(reader);
+ Assert.AreEqual(value, (DateTime)o["DateTime"]);
+
+ reader = new BsonReader(new MemoryStream(bson), false, DateTimeKind.Local);
+ o = (JObject)JToken.ReadFrom(reader);
+ Assert.AreEqual(value.ToLocalTime(), (DateTime)o["DateTime"]);
+
+ reader = new BsonReader(new MemoryStream(bson), false, DateTimeKind.Unspecified);
+ o = (JObject)JToken.ReadFrom(reader);
+ Assert.AreEqual(DateTime.SpecifyKind(value.ToLocalTime(), DateTimeKind.Unspecified), (DateTime)o["DateTime"]);
+ }
}
} \ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs b/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs
index bc3d323..e97f5b0 100644
--- a/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs
+++ b/Src/Newtonsoft.Json.Tests/Bson/BsonWriterTests.cs
@@ -147,11 +147,12 @@ namespace Newtonsoft.Json.Tests.Bson
s1.Open = true;
s1.product.Add(new Product
{
- ExpiryDate = new DateTime(2000, 9, 28, 3, 59, 58, DateTimeKind.Utc),
+ ExpiryDate = new DateTime(2000, 9, 28, 3, 59, 58, DateTimeKind.Local),
Name = "BSON!",
Price = -0.1m,
Sizes = new [] { "First", "Second" }
});
+ s1.Establised = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Local);
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(writer, s1);
diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj
index 0656659..2bede4e 100644
--- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj
+++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Compact.csproj
@@ -59,6 +59,8 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Bson\BsonReaderTests.cs" />
+ <Compile Include="Bson\BsonWriterTests.cs" />
<Compile Include="Converters\BinaryConverterTests.cs" />
<Compile Include="Converters\DataSetConverterTests.cs" />
<Compile Include="Converters\DataTableConverterTests.cs" />
diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj
index 84ac9c5..c21295f 100644
--- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj
+++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Net20.csproj
@@ -62,6 +62,8 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Bson\BsonReaderTests.cs" />
+ <Compile Include="Bson\BsonWriterTests.cs" />
<Compile Include="Converters\BinaryConverterTests.cs" />
<Compile Include="Converters\CustomCreationConverterTests.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 86cd963..6720b6d 100644
--- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj
+++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.Silverlight.csproj
@@ -68,6 +68,8 @@
</Reference>
</ItemGroup>
<ItemGroup>
+ <Compile Include="Bson\BsonReaderTests.cs" />
+ <Compile Include="Bson\BsonWriterTests.cs" />
<Compile Include="Converters\BinaryConverterTests.cs" />
<Compile Include="Converters\DataSetConverterTests.cs" />
<Compile Include="Converters\DataTableConverterTests.cs" />
diff --git a/Src/Newtonsoft.Json/Bson/BsonReader.cs b/Src/Newtonsoft.Json/Bson/BsonReader.cs
index 60b0b5e..a88deda 100644
--- a/Src/Newtonsoft.Json/Bson/BsonReader.cs
+++ b/Src/Newtonsoft.Json/Bson/BsonReader.cs
@@ -38,8 +38,9 @@ namespace Newtonsoft.Json.Bson
/// </summary>
public class BsonReader : JsonReader
{
+ private const int MaxCharBytesSize = 128;
+
private readonly BinaryReader _reader;
- private readonly bool _rootTypeIsArray;
private readonly List<ContainerContext> _stack;
private byte[] _byteBuffer;
@@ -48,7 +49,8 @@ namespace Newtonsoft.Json.Bson
private BsonReaderState _bsonReaderState;
private ContainerContext _currentContext;
- private const int MaxCharBytesSize = 128;
+ private bool _readRootValueAsArray;
+ private DateTimeKind _dateTimeKindHandling;
private enum BsonReaderState
{
@@ -76,10 +78,33 @@ namespace Newtonsoft.Json.Bson
}
/// <summary>
+ /// Gets or sets a value indicating whether the root object will be read as a JSON array.
+ /// </summary>
+ /// <value>
+ /// <c>true</c> if the root object will be read as a JSON array; otherwise, <c>false</c>.
+ /// </value>
+ public bool ReadRootValueAsArray
+ {
+ get { return _readRootValueAsArray; }
+ set { _readRootValueAsArray = value; }
+ }
+
+ /// <summary>
+ /// Gets or sets the <see cref="DateTimeKind" /> used when reading <see cref="DateTime"/> values from BSON.
+ /// </summary>
+ /// <value>The <see cref="DateTimeKind" /> used when reading <see cref="DateTime"/> values from BSON.</value>
+ public DateTimeKind DateTimeKindHandling
+ {
+ get { return _dateTimeKindHandling; }
+ set { _dateTimeKindHandling = value; }
+ }
+
+ /// <summary>
/// Initializes a new instance of the <see cref="BsonReader"/> class.
/// </summary>
/// <param name="stream">The stream.</param>
- public BsonReader(Stream stream) : this(stream, false)
+ public BsonReader(Stream stream)
+ : this(stream, false, DateTimeKind.Local)
{
}
@@ -87,13 +112,15 @@ namespace Newtonsoft.Json.Bson
/// Initializes a new instance of the <see cref="BsonReader"/> class.
/// </summary>
/// <param name="stream">The stream.</param>
- /// <param name="rootTypeIsArray">if set to <c>true</c> the root object will be read as a JSON array.</param>
- public BsonReader(Stream stream, bool rootTypeIsArray)
+ /// <param name="readRootValueAsArray">if set to <c>true</c> the root object will be read as a JSON array.</param>
+ /// <param name="dateTimeKindHandling">The <see cref="DateTimeKind" /> used when reading <see cref="DateTime"/> values from BSON.</param>
+ public BsonReader(Stream stream, bool readRootValueAsArray, DateTimeKind dateTimeKindHandling)
{
ValidationUtils.ArgumentNotNull(stream, "stream");
_reader = new BinaryReader(stream);
_stack = new List<ContainerContext>();
- _rootTypeIsArray = rootTypeIsArray;
+ _readRootValueAsArray = readRootValueAsArray;
+ _dateTimeKindHandling = dateTimeKindHandling;
}
private string ReadElement()
@@ -256,8 +283,8 @@ namespace Newtonsoft.Json.Bson
{
case State.Start:
{
- JsonToken token = (!_rootTypeIsArray) ? JsonToken.StartObject : JsonToken.StartArray;
- JTokenType type = (!_rootTypeIsArray) ? JTokenType.Object : JTokenType.Array;
+ JsonToken token = (!_readRootValueAsArray) ? JsonToken.StartObject : JsonToken.StartArray;
+ JTokenType type = (!_readRootValueAsArray) ? JTokenType.Object : JTokenType.Array;
SetToken(token);
ContainerContext newContext = new ContainerContext(type);
@@ -394,7 +421,22 @@ namespace Newtonsoft.Json.Bson
break;
case BsonType.Date:
long ticks = ReadInt64();
- DateTime dateTime = JsonConvert.ConvertJavaScriptTicksToDateTime(ticks);
+ DateTime utcDateTime = JsonConvert.ConvertJavaScriptTicksToDateTime(ticks);
+
+ DateTime dateTime;
+ switch (DateTimeKindHandling)
+ {
+ case DateTimeKind.Unspecified:
+ dateTime = DateTime.SpecifyKind(utcDateTime.ToLocalTime(), DateTimeKind.Unspecified);
+ break;
+ case DateTimeKind.Local:
+ dateTime = utcDateTime.ToLocalTime();
+ break;
+ default:
+ dateTime = utcDateTime;
+ break;
+ }
+
SetToken(JsonToken.Date, dateTime);
break;
case BsonType.Null:
diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj
index 48f0340..d974e42 100644
--- a/Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj
+++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Compact.csproj
@@ -57,6 +57,10 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Bson\BsonBinaryType.cs" />
+ <Compile Include="Bson\BsonReader.cs" />
+ <Compile Include="Bson\BsonType.cs" />
+ <Compile Include="Bson\BsonWriter.cs" />
<Compile Include="ConstructorHandling.cs" />
<Compile Include="Converters\BinaryConverter.cs" />
<Compile Include="Converters\CustomCreationConverter.cs" />
diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj
index 18c6920..60a0dac 100644
--- a/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj
+++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Net20.csproj
@@ -77,6 +77,10 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Bson\BsonBinaryType.cs" />
+ <Compile Include="Bson\BsonReader.cs" />
+ <Compile Include="Bson\BsonType.cs" />
+ <Compile Include="Bson\BsonWriter.cs" />
<Compile Include="ConstructorHandling.cs" />
<Compile Include="Converters\BinaryConverter.cs" />
<Compile Include="Converters\CustomCreationConverter.cs" />
diff --git a/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj b/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj
index 274c90f..b6868dd 100644
--- a/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj
+++ b/Src/Newtonsoft.Json/Newtonsoft.Json.Silverlight.csproj
@@ -54,6 +54,10 @@
<Reference Include="System.Windows.Browser" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Bson\BsonBinaryType.cs" />
+ <Compile Include="Bson\BsonReader.cs" />
+ <Compile Include="Bson\BsonType.cs" />
+ <Compile Include="Bson\BsonWriter.cs" />
<Compile Include="ConstructorHandling.cs" />
<Compile Include="Converters\BinaryConverter.cs" />
<Compile Include="Converters\CustomCreationConverter.cs" />