-Added ReadRootValueAsArray, DateTimeKindHandling properties to BsonReader
-Included BSON is .NET 2.0, Silverlight and Compact Framework builds
This commit is contained in:
@@ -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"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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
|
||||
{
|
||||
@@ -75,11 +77,34 @@ 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:
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user