public static bool TryResolve(string token, JsonDocumentBuilder current, out JsonDocumentBuilder result) { result = current; if (result.ValueKind == JsonValueKind.Array) { if (token == "-") { return(false); } int index = 0; if (!int.TryParse(token, out index)) { return(false); } if (index >= result.GetArrayLength()) { return(false); } result = result[index]; } else if (result.ValueKind == JsonValueKind.Object) { if (!result.TryGetProperty(token, out result)) { return(false); } } else { return(false); } return(true); }
public static bool TryRemove(this JsonPointer location, ref JsonDocumentBuilder root) { JsonDocumentBuilder current = root; string token = ""; var enumerator = location.GetEnumerator(); bool more = enumerator.MoveNext(); if (!more) { return(false); } while (more) { token = enumerator.Current; more = enumerator.MoveNext(); if (more) { if (!TryResolve(token, current, out current)) { return(false); } } } if (current.ValueKind == JsonValueKind.Array) { if (token.Length == 1 && token[0] == '-') { return(false); } else { int index; if (!int.TryParse(token, out index)) { return(false); } if (index >= current.GetArrayLength()) { return(false); } current.RemoveArrayItemAt(index); } } else if (current.ValueKind == JsonValueKind.Object) { if (current.ContainsPropertyName(token)) { current.RemoveProperty(token); } } else { return(false); } return(true); }
public static JsonPointer ToDefinitePath(this JsonPointer pointer, JsonDocumentBuilder value) { if (value.ValueKind == JsonValueKind.Array && pointer.Tokens.Count > 0 && pointer.Tokens[pointer.Tokens.Count - 1] == "-") { var tokens = new List <string>(); for (int i = 0; i < pointer.Tokens.Count - 1; ++i) { tokens.Add(pointer.Tokens[i]); } tokens.Add(value.GetArrayLength().ToString()); return(new JsonPointer(tokens)); } else { return(pointer); } }
static bool TryUnflattenArray(JsonElement value, out JsonDocumentBuilder result) { if (value.ValueKind != JsonValueKind.Object) { throw new ArgumentException("The value to unflatten is not a JSON object"); } result = new JsonDocumentBuilder(JsonValueKind.Object); foreach (var item in value.EnumerateObject()) { JsonDocumentBuilder? parent = null; JsonDocumentBuilder part = result; int parentIndex = 0; string parentName = ""; JsonPointer ptr; if (!JsonPointer.TryParse(item.Name, out ptr)) { throw new ArgumentException("Name contains invalid JSON Pointer"); } int index = 0; var it = ptr.GetEnumerator(); bool more = it.MoveNext(); while (more) { string token = it.Current; int n; if (int.TryParse(token, out n) && index++ == n) { if (part.ValueKind != JsonValueKind.Array) { if (parent != null && parent.ValueKind == JsonValueKind.Object) { parent.RemoveProperty(parentName); var val = new JsonDocumentBuilder(JsonValueKind.Array); parent.AddProperty(parentName, val); part = val; } else if (parent != null && parent.ValueKind == JsonValueKind.Array) { var val = new JsonDocumentBuilder(JsonValueKind.Array); parent[parentIndex] = val; part = val; } else { return false; } } parent = part; parentIndex = n; parentName = token; more = it.MoveNext(); if (more) { if (n >= part.GetArrayLength()) { part.AddArrayItem(new JsonDocumentBuilder(JsonValueKind.Object)); part = part[part.GetArrayLength() - 1]; } else { part = part[n]; } } else { part.AddArrayItem(new JsonDocumentBuilder(item.Value)); part = part[part.GetArrayLength() - 1]; } } else if (part.ValueKind == JsonValueKind.Object) { more = it.MoveNext(); if (more) { JsonDocumentBuilder val; if (part.TryGetProperty(token, out val)) { part = val; } else { val = new JsonDocumentBuilder(JsonValueKind.Object); part.AddProperty(token,val); part = val; } } else { JsonDocumentBuilder val; if (part.TryGetProperty(token, out val)) { part = val; } else { val = new JsonDocumentBuilder(item.Value); part.AddProperty(token,val); part = val; } } } else { return false; } } } return true; }