/// <summary> /// Find token at the specified jPath /// </summary> /// <param name="jPath">The jPath location of the token</param> /// <param name="renameWith">A new property name to the token at specified jPath if it's an object</param> /// <param name="replaceWith">A new token to override the token at specified jPath</param> /// <param name="remove">Indicate if the token should be removed</param> /// <returns>The located token</returns> private LazyJsonToken InternalFind(String jPath, String renameWith = null, LazyJsonToken replaceWith = null, Boolean remove = false) { List <LazyJsonPathNode> pathNodeList = LazyJsonPath.Parse(jPath); if (pathNodeList.Count == 0) { return(null); } LazyJsonToken jsonTokenParent = this.Root; LazyJsonToken jsonToken = null; Int32 pathIndex = 0; if (pathNodeList.Count == 1) { if (replaceWith != null) { this.Root = replaceWith; } return(jsonTokenParent); } pathNodeList.RemoveAt(0); #region Find parent token for (pathIndex = 0; pathIndex < (pathNodeList.Count - 1); pathIndex++) { if (pathNodeList[pathIndex].Type == LazyJsonPathType.Property) { if (jsonTokenParent.Type != LazyJsonType.Object) { return(null); } LazyJsonProperty jsonProperty = ((LazyJsonObject)jsonTokenParent)[((LazyJsonPathProperty)pathNodeList[pathIndex]).Name]; if (jsonProperty == null) { return(null); } jsonTokenParent = jsonProperty.Token; } else if (pathNodeList[pathIndex].Type == LazyJsonPathType.ArrayIndex) { if (jsonTokenParent.Type != LazyJsonType.Array) { return(null); } jsonTokenParent = ((LazyJsonArray)jsonTokenParent)[Convert.ToInt32(((LazyJsonPathArrayIndex)pathNodeList[pathIndex]).Index)]; } } #endregion Find parent token #region Find token if (pathNodeList[pathIndex].Type == LazyJsonPathType.Property) { if (jsonTokenParent.Type != LazyJsonType.Object) { return(null); } LazyJsonObject jsonObjectParent = (LazyJsonObject)jsonTokenParent; LazyJsonProperty jsonProperty = jsonObjectParent[((LazyJsonPathProperty)pathNodeList[pathIndex]).Name]; if (jsonProperty == null) { return(null); } jsonToken = jsonProperty.Token; if (remove == true) { jsonObjectParent.Remove(jsonProperty.Name); } else { if (renameWith != null) { jsonProperty.Name = renameWith; } if (replaceWith != null) { jsonProperty.Token = replaceWith; } } } else if (pathNodeList[pathIndex].Type == LazyJsonPathType.ArrayIndex) { if (jsonTokenParent.Type != LazyJsonType.Array) { return(null); } LazyJsonArray jsonArrayParent = (LazyJsonArray)jsonTokenParent; Int32 index = Convert.ToInt32(((LazyJsonPathArrayIndex)pathNodeList[pathIndex]).Index); jsonToken = jsonArrayParent[index]; if (jsonToken != null) { if (remove == true) { jsonArrayParent.TokenList.RemoveAt(index); } else { if (replaceWith != null) { jsonArrayParent[index] = replaceWith; } } } } #endregion Find token return(jsonToken); }
/// <summary> /// Append a json token at specified jPath /// </summary> /// <param name="jPath">The jPath location to append the token</param> /// <param name="jsonToken">The json token</param> public void AppendToken(String jPath, LazyJsonToken jsonToken) { if (jPath == "$") { this.Root = jsonToken != null ? jsonToken : new LazyJsonNull(); } else { List <LazyJsonPathNode> jsonPathNodeList = LazyJsonPath.Parse(jPath); String jPathParent = String.Join('.', jsonPathNodeList.ToJsonPathNodeArray(), 0, jsonPathNodeList.Count - 1); LazyJsonToken jsonTokenParent = Find(jPathParent); if (jsonTokenParent != null) { if (jsonPathNodeList[jsonPathNodeList.Count - 1].Type == LazyJsonPathType.ArrayIndex) { if (jsonTokenParent.Type == LazyJsonType.Array) { LazyJsonPathArrayIndex jsonPathArrayIndex = (LazyJsonPathArrayIndex)jsonPathNodeList[jsonPathNodeList.Count - 1]; ((LazyJsonArray)jsonTokenParent)[Convert.ToInt32(jsonPathArrayIndex.Index)] = jsonToken; } else { LazyJsonArray jsonArray = new LazyJsonArray(); jsonArray.Add(jsonToken); Find(jPathParent, replaceWith: jsonArray); } } else if (jsonPathNodeList[jsonPathNodeList.Count - 1].Type == LazyJsonPathType.Property) { if (jsonTokenParent.Type == LazyJsonType.Object) { LazyJsonPathProperty jsonPathProperty = (LazyJsonPathProperty)jsonPathNodeList[jsonPathNodeList.Count - 1]; ((LazyJsonObject)jsonTokenParent)[jsonPathProperty.Name] = new LazyJsonProperty(jsonPathProperty.Name, jsonToken); } else { LazyJsonObject jsonObject = new LazyJsonObject(); jsonObject.Add(new LazyJsonProperty(((LazyJsonPathProperty)jsonPathNodeList[jsonPathNodeList.Count - 1]).Name, jsonToken)); Find(jPathParent, replaceWith: jsonObject); } } } else { if (jsonPathNodeList[jsonPathNodeList.Count - 1].Type == LazyJsonPathType.ArrayIndex) { LazyJsonArray jsonArray = new LazyJsonArray(); jsonArray.Add(jsonToken); AppendToken(jPathParent, jsonArray); } else if (jsonPathNodeList[jsonPathNodeList.Count - 1].Type == LazyJsonPathType.Property) { LazyJsonObject jsonObject = new LazyJsonObject(); jsonObject.Add(new LazyJsonProperty(((LazyJsonPathProperty)jsonPathNodeList[jsonPathNodeList.Count - 1]).Name, jsonToken)); AppendToken(jPathParent, jsonObject); } } } }