/// <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()); }
/// <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);
/// <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())); }