Ejemplo n.º 1
0
        /// <summary>
        /// Parses the list.
        /// </summary>
        /// <param name="asDictionaryKey">If set to <c>true</c> [as dictionary key].</param>
        /// <param name="cache">The cache.</param>
        /// <param name="handler">The handler.</param>
        /// <returns>
        /// The parsed list.
        /// </returns>
        public override object ParseList(bool asDictionaryKey, ReadCache cache, IListReadHandler handler)
        {
            // if nextToken == JsonToken.EndArray
            if (jp.NextToken() != JsonToken.EndArray) 
            {
                object firstVal = ParseVal(false, cache);
                if (firstVal != null) 
                {
                    if (firstVal is string && (string)firstVal == Constants.DirectoryAsList) 
                    {
                        // if the same, build a map w/ rest of array contents
                        return ParseDictionary(false, cache, null, JsonToken.EndArray);
                    }
                    else 
                        if (firstVal is Tag) 
                        {
                            if (firstVal is Tag) 
                            {
                                object val;
                                jp.Read(); // advance to value
                                string tag = ((Tag)firstVal).GetValue();
                                IReadHandler val_handler;
                                if (TryGetHandler(tag, out val_handler)) 
                                {
                                    if (this.jp.TokenType == JsonToken.StartObject && val_handler is IDictionaryReadHandler) 
                                    {
                                        // use map reader to decode value
                                        val = ParseDictionary(false, cache, (IDictionaryReadHandler)val_handler);
                                    } 
                                    else 
                                        if (this.jp.TokenType == JsonToken.StartArray && val_handler is IListReadHandler) 
                                        {
                                            // use array reader to decode value
                                            val = ParseList(false, cache, (IListReadHandler)val_handler);
                                        } 
                                        else 
                                        {
                                            // read value and decode normally
                                            val = val_handler.FromRepresentation(ParseVal(false, cache));
                                        }
                                } 
                                else 
                                {
                                    // default decode
                                    val = this.Decode(tag, ParseVal(false, cache));
                                }
                                jp.Read(); // advance past end of object or array
                                return val;
                            }
                        }
                }

                IListReader lr = (handler != null) ? handler.ListReader() : listBuilder;
                object l = lr.Init();
                l = lr.Add(l, firstVal);
                while (jp.NextToken() != JsonToken.EndArray) {
                    l = lr.Add(l, ParseVal(false, cache));
                }
                return lr.Complete(l);
            }

            // array is empty
            return listBuilder.Complete(listBuilder.Init());            
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Parses the list.
 /// </summary>
 /// <param name="asDictionaryKey">If set to <c>true</c> [as dictionary key].</param>
 /// <param name="cache">The cache.</param>
 /// <param name="handler">The handler.</param>
 /// <returns>
 /// The parsed list.
 /// </returns>
 public abstract object ParseList(bool asDictionaryKey, ReadCache cache, IListReadHandler handler);
 /// <summary>
 /// Parses the list.
 /// </summary>
 /// <param name="asDictionaryKey">If set to <c>true</c> [as dictionary key].</param>
 /// <param name="cache">The cache.</param>
 /// <param name="handler">The handler.</param>
 /// <returns>
 /// The parsed list.
 /// </returns>
 public abstract object ParseList(bool asDictionaryKey, ReadCache cache, IListReadHandler handler);
Ejemplo n.º 4
0
        /// <summary>
        /// Parses the list.
        /// </summary>
        /// <param name="asDictionaryKey">If set to <c>true</c> [as dictionary key].</param>
        /// <param name="cache">The cache.</param>
        /// <param name="handler">The handler.</param>
        /// <returns>
        /// The parsed list.
        /// </returns>
        public override object ParseList(bool asDictionaryKey, ReadCache cache, IListReadHandler handler)
        {
            // if nextToken == JsonToken.EndArray
            if (jp.NextToken() != JsonToken.EndArray)
            {
                object firstVal = ParseVal(false, cache);
                if (firstVal != null)
                {
                    if (firstVal is string && (string)firstVal == Constants.DirectoryAsList)
                    {
                        // if the same, build a map w/ rest of array contents
                        return(ParseDictionary(false, cache, null, JsonToken.EndArray));
                    }
                    else
                    if (firstVal is Tag)
                    {
                        if (firstVal is Tag)
                        {
                            object val;
                            jp.Read();     // advance to value
                            string       tag = ((Tag)firstVal).GetValue();
                            IReadHandler val_handler;
                            if (TryGetHandler(tag, out val_handler))
                            {
                                if (this.jp.TokenType == JsonToken.StartObject && val_handler is IDictionaryReadHandler)
                                {
                                    // use map reader to decode value
                                    val = ParseDictionary(false, cache, (IDictionaryReadHandler)val_handler);
                                }
                                else
                                if (this.jp.TokenType == JsonToken.StartArray && val_handler is IListReadHandler)
                                {
                                    // use array reader to decode value
                                    val = ParseList(false, cache, (IListReadHandler)val_handler);
                                }
                                else
                                {
                                    // read value and decode normally
                                    val = val_handler.FromRepresentation(ParseVal(false, cache));
                                }
                            }
                            else
                            {
                                // default decode
                                val = this.Decode(tag, ParseVal(false, cache));
                            }
                            jp.Read();     // advance past end of object or array
                            return(val);
                        }
                    }
                }

                IListReader lr = (handler != null) ? handler.ListReader() : listBuilder;
                object      l  = lr.Init();
                l = lr.Add(l, firstVal);
                while (jp.NextToken() != JsonToken.EndArray)
                {
                    l = lr.Add(l, ParseVal(false, cache));
                }
                return(lr.Complete(l));
            }

            // array is empty
            return(listBuilder.Complete(listBuilder.Init()));
        }