예제 #1
0
        private JToken GenerateJToken(IBsonReader reader, JToken parent)
        {
            switch (reader.CurrentBsonType)
            {
            case BsonType.Symbol:
            case BsonType.JavaScriptWithScope:
            case BsonType.JavaScript:
            case BsonType.ObjectId:
            case BsonType.RegularExpression:
            case BsonType.DateTime:
            case BsonType.Decimal128:
            case BsonType.MinKey:
            case BsonType.MaxKey:
            case BsonType.String:
                return(reader.ReadString());

            case BsonType.Binary:
                return(reader.ReadBytes());

            case BsonType.Undefined:
                reader.ReadUndefined();
                return(JValue.CreateUndefined());

            case BsonType.Boolean:
                return(reader.ReadBoolean());

            case BsonType.Null:
                reader.ReadNull();
                return(JValue.CreateNull());

            case BsonType.Int32:
                return(reader.ReadInt32());

            case BsonType.Int64:
            case BsonType.Timestamp:
                return(reader.ReadInt64());

            case BsonType.Double:
                return(reader.ReadDouble());

            case BsonType.Document:
                return(GenerateJObject(reader, parent));

            case BsonType.Array:
                return(GenerateJArray(reader, parent));

            case BsonType.EndOfDocument:
                break;

            default:
                break;
            }
            return(null);
        }
예제 #2
0
        public void TestUndefinedKeyword()
        {
            var json = "undefined";

            using (_bsonReader = new JsonReader(json))
            {
                Assert.Equal(BsonType.Undefined, _bsonReader.ReadBsonType());
                _bsonReader.ReadUndefined();
                Assert.Equal(BsonReaderState.Initial, _bsonReader.State);
            }
            Assert.Equal(json, BsonSerializer.Deserialize <BsonUndefined>(json).ToJson());
        }
예제 #3
0
        public void TestUndefinedExtendedJson()
        {
            var json = "{ \"$undefined\" : true }";

            using (_bsonReader = new JsonReader(json))
            {
                Assert.Equal(BsonType.Undefined, _bsonReader.ReadBsonType());
                _bsonReader.ReadUndefined();
                Assert.Equal(BsonReaderState.Initial, _bsonReader.State);
            }
            var canonicalJson = "undefined";

            Assert.Equal(canonicalJson, BsonSerializer.Deserialize <BsonUndefined>(new StringReader(json)).ToJson());
        }
        /// <summary>
        ///     做安全读入指定字段之前的准备工作
        /// </summary>
        /// <param name="bsonReader">Bson读取器</param>
        /// <param name="expected">字段名</param>
        /// <param name="read">字段名缓存</param>
        /// <returns>是否可以继续读入</returns>
        private static bool ReadPrep(this IBsonReader bsonReader, string expected, ref string read)
        {
            if (!bsonReader.ReadName(expected, ref read))
            {
                return(false);
            }

            switch (bsonReader.CurrentBsonType)
            {
            case BsonType.Null:
                bsonReader.ReadNull();
                return(false);

            case BsonType.Undefined:
                bsonReader.ReadUndefined();
                return(false);
            }

            return(true);
        }
예제 #5
0
 /// <summary>
 /// Reads a BSON undefined element from the reader.
 /// </summary>
 /// <param name="reader">The reader.</param>
 /// <param name="name">The name of the element.</param>
 public static void ReadUndefined(this IBsonReader reader, string name)
 {
     VerifyName(reader, name);
     reader.ReadUndefined();
 }
        // private methods
        private void ReadValue()
        {
            object jsonDotNetValue;

            switch (_wrappedReader.GetCurrentBsonType())
            {
            case BsonType.Array:
                _wrappedReader.ReadStartArray();
                SetCurrentToken(Newtonsoft.Json.JsonToken.StartArray);
                return;

            case BsonType.Binary:
                var bsonBinaryData = _wrappedReader.ReadBinaryData();
                switch (bsonBinaryData.SubType)
                {
                case BsonBinarySubType.UuidLegacy:
                    var guidRepresentation = GuidRepresentation.Unspecified;
                    var bsonReader         = _wrappedReader as BsonReader;
                    if (bsonReader != null)
                    {
                        guidRepresentation = bsonReader.Settings.GuidRepresentation;
                    }
                    jsonDotNetValue = GuidConverter.FromBytes(bsonBinaryData.Bytes, guidRepresentation);
                    break;

                case BsonBinarySubType.UuidStandard:
                    jsonDotNetValue = GuidConverter.FromBytes(bsonBinaryData.Bytes, GuidRepresentation.Standard);
                    break;

                default:
                    jsonDotNetValue = bsonBinaryData.Bytes;
                    break;
                }
                SetCurrentToken(Newtonsoft.Json.JsonToken.Bytes, jsonDotNetValue, bsonBinaryData);
                return;

            case BsonType.Boolean:
                var booleanValue = _wrappedReader.ReadBoolean();
                SetCurrentToken(Newtonsoft.Json.JsonToken.Boolean, booleanValue, (BsonBoolean)booleanValue);
                return;

            case BsonType.DateTime:
                var bsonDateTime = new BsonDateTime(_wrappedReader.ReadDateTime());
                if (bsonDateTime.IsValidDateTime)
                {
                    jsonDotNetValue = bsonDateTime.ToUniversalTime();
                }
                else
                {
                    jsonDotNetValue = bsonDateTime.MillisecondsSinceEpoch;
                }
                SetCurrentToken(Newtonsoft.Json.JsonToken.Date, jsonDotNetValue, bsonDateTime);
                return;

            case BsonType.Document:
                _wrappedReader.ReadStartDocument();
                SetCurrentToken(Newtonsoft.Json.JsonToken.StartObject);
                return;

            case BsonType.Double:
                var bsonDouble = new BsonDouble(_wrappedReader.ReadDouble());
                switch (FloatParseHandling)
                {
                case Newtonsoft.Json.FloatParseHandling.Decimal:
                    jsonDotNetValue = Convert.ToDecimal(bsonDouble);
                    break;

                case Newtonsoft.Json.FloatParseHandling.Double:
                    jsonDotNetValue = bsonDouble.Value;
                    break;

                default:
                    throw new NotSupportedException(string.Format("Unexpected FloatParseHandling value: {0}.", FloatParseHandling));
                }
                SetCurrentToken(Newtonsoft.Json.JsonToken.Float, jsonDotNetValue, bsonDouble);
                return;

            case BsonType.Int32:
                var bsonInt32 = (BsonInt32)_wrappedReader.ReadInt32();
                SetCurrentToken(Newtonsoft.Json.JsonToken.Integer, (long)bsonInt32.Value, bsonInt32);
                return;

            case BsonType.Int64:
                var bsonInt64 = (BsonInt64)_wrappedReader.ReadInt64();
                SetCurrentToken(Newtonsoft.Json.JsonToken.Integer, bsonInt64.Value, bsonInt64);
                return;

            case BsonType.JavaScript:
            {
                var code           = _wrappedReader.ReadJavaScript();
                var bsonJavaScript = new BsonJavaScript(code);
                SetCurrentToken(Newtonsoft.Json.JsonToken.String, code, bsonJavaScript);
            }
                return;

            case BsonType.JavaScriptWithScope:
            {
                var code    = _wrappedReader.ReadJavaScriptWithScope();
                var context = BsonDeserializationContext.CreateRoot(_wrappedReader);
                var scope   = BsonDocumentSerializer.Instance.Deserialize <BsonDocument>(context);
                var bsonJavaScriptWithScope = new BsonJavaScriptWithScope(code, scope);
                SetCurrentToken(Newtonsoft.Json.JsonToken.String, code, bsonJavaScriptWithScope);
            }
                return;

            case BsonType.MaxKey:
                _wrappedReader.ReadMaxKey();
                SetCurrentToken(Newtonsoft.Json.JsonToken.Undefined, null, BsonMaxKey.Value);
                return;

            case BsonType.MinKey:
                _wrappedReader.ReadMinKey();
                SetCurrentToken(Newtonsoft.Json.JsonToken.Undefined, null, BsonMinKey.Value);
                return;

            case BsonType.Null:
                _wrappedReader.ReadNull();
                SetCurrentToken(Newtonsoft.Json.JsonToken.Null, null, BsonNull.Value);
                return;

            case BsonType.ObjectId:
                var bsonObjectId = new BsonObjectId(_wrappedReader.ReadObjectId());
                SetCurrentToken(Newtonsoft.Json.JsonToken.Bytes, bsonObjectId.Value.ToByteArray(), bsonObjectId);
                return;

            case BsonType.RegularExpression:
                var bsonRegularExpression = _wrappedReader.ReadRegularExpression();
                var pattern = bsonRegularExpression.Pattern;
                var options = bsonRegularExpression.Options;
                jsonDotNetValue = "/" + pattern.Replace("/", "\\/") + "/" + options;
                SetCurrentToken(Newtonsoft.Json.JsonToken.String, jsonDotNetValue, bsonRegularExpression);
                return;

            case BsonType.String:
                var stringValue = _wrappedReader.ReadString();
                SetCurrentToken(Newtonsoft.Json.JsonToken.String, stringValue, (BsonString)stringValue);
                return;

            case BsonType.Symbol:
                var bsonSymbol = BsonSymbolTable.Lookup(_wrappedReader.ReadSymbol());
                SetCurrentToken(Newtonsoft.Json.JsonToken.String, bsonSymbol.Name, bsonSymbol);
                return;

            case BsonType.Timestamp:
                var bsonTimestamp = new BsonTimestamp(_wrappedReader.ReadTimestamp());
                SetCurrentToken(Newtonsoft.Json.JsonToken.Integer, bsonTimestamp.Value, bsonTimestamp);
                return;

            case BsonType.Undefined:
                _wrappedReader.ReadUndefined();
                SetCurrentToken(Newtonsoft.Json.JsonToken.Undefined, null, BsonUndefined.Value);
                return;

            default:
                var message = string.Format("Unexpected BsonType: {0}.", _wrappedReader.GetCurrentBsonType());
                throw new Newtonsoft.Json.JsonReaderException(message);
            }
        }
 public void TestUndefinedKeyword()
 {
     var json = "undefined";
     using (_bsonReader = new JsonReader(json))
     {
         Assert.Equal(BsonType.Undefined, _bsonReader.ReadBsonType());
         _bsonReader.ReadUndefined();
         Assert.Equal(BsonReaderState.Initial, _bsonReader.State);
     }
     Assert.Equal(json, BsonSerializer.Deserialize<BsonUndefined>(json).ToJson());
 }
 public void TestUndefinedExtendedJson()
 {
     var json = "{ \"$undefined\" : true }";
     using (_bsonReader = new JsonReader(json))
     {
         Assert.Equal(BsonType.Undefined, _bsonReader.ReadBsonType());
         _bsonReader.ReadUndefined();
         Assert.Equal(BsonReaderState.Initial, _bsonReader.State);
     }
     var canonicalJson = "undefined";
     Assert.Equal(canonicalJson, BsonSerializer.Deserialize<BsonUndefined>(new StringReader(json)).ToJson());
 }
예제 #9
0
        public override bool Read()
        {
            if (bsonReader.State == BsonReaderState.Initial ||
                bsonReader.State == BsonReaderState.ScopeDocument ||
                bsonReader.State == BsonReaderState.Type)
            {
                bsonReader.ReadBsonType();
            }

            if (bsonReader.State == BsonReaderState.Name)
            {
                SetToken(NewtonsoftJsonToken.PropertyName, bsonReader.ReadName().UnescapeBson());
            }
            else if (bsonReader.State == BsonReaderState.Value)
            {
                switch (bsonReader.CurrentBsonType)
                {
                case BsonType.Document:
                    SetToken(NewtonsoftJsonToken.StartObject);
                    bsonReader.ReadStartDocument();
                    break;

                case BsonType.Array:
                    SetToken(NewtonsoftJsonToken.StartArray);
                    bsonReader.ReadStartArray();
                    break;

                case BsonType.Undefined:
                    SetToken(NewtonsoftJsonToken.Undefined);
                    bsonReader.ReadUndefined();
                    break;

                case BsonType.Null:
                    SetToken(NewtonsoftJsonToken.Null);
                    bsonReader.ReadNull();
                    break;

                case BsonType.String:
                    SetToken(NewtonsoftJsonToken.String, bsonReader.ReadString());
                    break;

                case BsonType.Binary:
                    SetToken(NewtonsoftJsonToken.Bytes, bsonReader.ReadBinaryData().Bytes);
                    break;

                case BsonType.Boolean:
                    SetToken(NewtonsoftJsonToken.Boolean, bsonReader.ReadBoolean());
                    break;

                case BsonType.DateTime:
                    SetToken(NewtonsoftJsonToken.Date, bsonReader.ReadDateTime());
                    break;

                case BsonType.Int32:
                    SetToken(NewtonsoftJsonToken.Integer, bsonReader.ReadInt32());
                    break;

                case BsonType.Int64:
                    SetToken(NewtonsoftJsonToken.Integer, bsonReader.ReadInt64());
                    break;

                case BsonType.Double:
                    SetToken(NewtonsoftJsonToken.Float, bsonReader.ReadDouble());
                    break;

                case BsonType.Decimal128:
                    SetToken(NewtonsoftJsonToken.Float, Decimal128.ToDouble(bsonReader.ReadDecimal128()));
                    break;

                default:
                    throw new NotSupportedException();
                }
            }
            else if (bsonReader.State == BsonReaderState.EndOfDocument)
            {
                SetToken(NewtonsoftJsonToken.EndObject);
                bsonReader.ReadEndDocument();
            }
            else if (bsonReader.State == BsonReaderState.EndOfArray)
            {
                SetToken(NewtonsoftJsonToken.EndArray);
                bsonReader.ReadEndArray();
            }

            if (bsonReader.State == BsonReaderState.Initial)
            {
                return(true);
            }

            return(!bsonReader.IsAtEndOfFile());
        }