public static IEnumerable <JSegment> Parse(ITokenBuffer path) { var segments = new List <JSegment>(); var next = path.MoveNextNonEmptyChar(); if (next.HasValue && next.Value == JConstants.SegmentRootToken) { var root = new JSegment(SegmentType.Root, ExpandRoot); next = path.MoveNextNonEmptyChar(); if (!next.HasValue) { segments.Add(root); return(segments); } if (next == JConstants.ExpressionStartToken) {//i contain an expression var expr = path.MoveNext((s, i, c) => s[i + 1] == JConstants.ExpressionEndToken); if (!string.IsNullOrEmpty(expr)) { root = new JSegment(SegmentType.Root, ExpandRoot, expr); } JUtils.ValidateChar(path.MoveNext(), JConstants.ExpressionEndToken); next = path.MoveNextNonEmptyChar(); } segments.Add(root); if (!next.HasValue) { return(segments); } JUtils.ValidateChar(next, JConstants.SegmentSeparatorToken); } bool hasMoreSegments = true; while (hasMoreSegments) { var segment = path.MoveNext((s, i, c) => i == s.Length - 1 || s[i + 1] == JConstants.SegmentSeparatorToken); var processedSegments = ProcessRawSegment(segment); segments.AddRange(processedSegments); next = path.MoveNext(); if (!next.HasValue) { hasMoreSegments = false; } else { JUtils.ValidateChar(next, JConstants.SegmentSeparatorToken); } } return(segments); }
public static JNode Find(IEnumerable <JSegment> expression, JNode json) { return(JSegment.Expand(expression, json)); }
public static JNode Find(string expression, JNode json) { return(JSegment.Expand(expression, json)); }