Esempio n. 1
0
 internal JsonReaderException CreateUnexpectedEndException()
 {
     return(JsonReaderException.Create(this, "Unexpected end when reading JSON."));
 }
Esempio n. 2
0
        /// <summary>
        ///     Reads the next JSON token from the source as a <see cref="Byte" />[].
        /// </summary>
        /// <returns>
        ///     A <see cref="Byte" />[] or <c>null</c> if the next JSON token is null. This method will return <c>null</c> at
        ///     the end of an array.
        /// </returns>
        public virtual byte[] ReadAsBytes()
        {
            var t = GetContentToken();

            switch (t)
            {
            case JsonToken.StartObject:
            {
                ReadIntoWrappedTypeObject();

                var data = ReadAsBytes();
                ReaderReadAndAssert();

                if (TokenType != JsonToken.EndObject)
                {
                    throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
                }

                SetToken(JsonToken.Bytes, data, false);
                return(data);
            }

            case JsonToken.String:
            {
                // attempt to convert possible base 64 or GUID string to bytes
                // GUID has to have format 00000000-0000-0000-0000-000000000000
                var s = (string)Value;

                byte[] data;

                Guid g;
                if (s.Length == 0)
                {
                    data = CollectionUtils.ArrayEmpty <byte>();
                }
                else if (ConvertUtils.TryConvertGuid(s, out g))
                {
                    data = g.ToByteArray();
                }
                else
                {
                    data = Convert.FromBase64String(s);
                }

                SetToken(JsonToken.Bytes, data, false);
                return(data);
            }

            case JsonToken.None:
            case JsonToken.Null:
            case JsonToken.EndArray:
                return(null);

            case JsonToken.Bytes:
                if (ValueType == typeof(Guid))
                {
                    var data = ((Guid)Value).ToByteArray();
                    SetToken(JsonToken.Bytes, data, false);
                    return(data);
                }

                return((byte[])Value);

            case JsonToken.StartArray:
                return(ReadArrayIntoByteArray());
            }

            throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t));
        }
Esempio n. 3
0
        internal byte[] ReadAsBytesInternal()
        {
            _readType = ReadType.ReadAsBytes;

            JsonToken t;

            do
            {
                if (!ReadInternal())
                {
                    SetToken(JsonToken.None);
                    return(null);
                }
                t = TokenType;
            } while (t == JsonToken.Comment);

            if (IsWrappedInTypeObject())
            {
                var data = ReadAsBytes();
                ReadInternal();
                SetToken(JsonToken.Bytes, data, false);
                return(data);
            }

            // attempt to convert possible base 64 string to bytes
            if (t == JsonToken.String)
            {
                var s = (string)Value;

                byte[] data;

                Guid g;
                if (s.Length == 0)
                {
                    data = new byte[0];
                }
                else if (ConvertUtils.TryConvertGuid(s, out g))
                {
                    data = g.ToByteArray();
                }
                else
                {
                    data = Convert.FromBase64String(s);
                }

                SetToken(JsonToken.Bytes, data, false);
                return(data);
            }

            if (t == JsonToken.Null)
            {
                return(null);
            }

            if (t == JsonToken.Bytes)
            {
                if (ValueType != typeof(Guid))
                {
                    return((byte[])Value);
                }
                var data = ((Guid)Value).ToByteArray();
                SetToken(JsonToken.Bytes, data, false);
                return(data);
            }

            if (t == JsonToken.StartArray)
            {
                var data = new List <byte>();

                while (ReadInternal())
                {
                    t = TokenType;
                    switch (t)
                    {
                    case JsonToken.Integer:
                        data.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture));
                        break;

                    case JsonToken.EndArray:
                        byte[] d = data.ToArray();
                        SetToken(JsonToken.Bytes, d, false);
                        return(d);

                    case JsonToken.Comment:
                        // skip
                        break;

                    default:
                        throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, t));
                    }
                }

                throw JsonReaderException.Create(this, "Unexpected end when reading bytes.");
            }

            if (t == JsonToken.EndArray)
            {
                return(null);
            }

            throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t));
        }
Esempio n. 4
0
        internal bool ReadForType(JsonContract contract, bool hasConverter)
        {
            // don't read properties with converters as a specific value
            // the value might be a string which will then get converted which will error if read as date for example
            if (hasConverter)
            {
                return(Read());
            }

            var t = contract != null ? contract.InternalReadType : ReadType.Read;

            switch (t)
            {
            case ReadType.Read:
                return(ReadAndMoveToContent());

            case ReadType.ReadAsInt32:
                ReadAsInt32();
                break;

            case ReadType.ReadAsInt64:
                var result = ReadAndMoveToContent();
                if (TokenType == JsonToken.Undefined)
                {
                    throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType));
                }
                return(result);

            case ReadType.ReadAsDecimal:
                ReadAsDecimal();
                break;

            case ReadType.ReadAsDouble:
                ReadAsDouble();
                break;

            case ReadType.ReadAsBytes:
                ReadAsBytes();
                break;

            case ReadType.ReadAsBoolean:
                ReadAsBoolean();
                break;

            case ReadType.ReadAsString:
                ReadAsString();
                break;

            case ReadType.ReadAsDateTime:
                ReadAsDateTime();
                break;

            case ReadType.ReadAsDateTimeOffset:
                ReadAsDateTimeOffset();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(TokenType != JsonToken.None);
        }
Esempio n. 5
0
        internal DateTimeOffset?ReadAsDateTimeOffsetInternal()
        {
            _readType = ReadType.ReadAsDateTimeOffset;

            JsonToken t;

            do
            {
                if (!ReadInternal())
                {
                    SetToken(JsonToken.None);
                    return(null);
                }
                t = TokenType;
            } while (t == JsonToken.Comment);

            if (t == JsonToken.Date)
            {
                if (Value is DateTime)
                {
                    SetToken(JsonToken.Date, new DateTimeOffset((DateTime)Value), false);
                }
                return((DateTimeOffset)Value);
            }

            if (t == JsonToken.Null)
            {
                return(null);
            }

            if (t == JsonToken.String)
            {
                var s = (string)Value;
                if (string.IsNullOrEmpty(s))
                {
                    SetToken(JsonToken.Null);
                    return(null);
                }

                object         temp;
                DateTimeOffset dt;
                if (DateTimeUtils.TryParseDateTime(s, DateParseHandling.DateTimeOffset, DateTimeZoneHandling, _dateFormatString, Culture, out temp))
                {
                    dt = (DateTimeOffset)temp;
                    SetToken(JsonToken.Date, dt, false);
                    return(dt);
                }

                if (!DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt))
                {
                    throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, Value));
                }
                SetToken(JsonToken.Date, dt, false);
                return(dt);
            }

            if (t == JsonToken.EndArray)
            {
                return(null);
            }

            throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t));
        }