public Dictionary ToDictionary()

in src/Elastic.Transport/Responses/Dynamic/DynamicDictionary.cs [44:98]


	public Dictionary<string, object> ToDictionary() =>
		_backingDictionary.ToDictionary(kv => kv.Key, kv => kv.Value.Value is JsonElement e ? DynamicValue.ConsumeJsonElement(typeof(object), e) : kv.Value.Value);

	/// <summary>
	/// Returns an empty dynamic dictionary.
	/// </summary>
	/// <value>A <see cref="DynamicDictionary" /> instance.</value>
	public static DynamicDictionary Empty => new DynamicDictionary();

	/// <summary>
	/// Gets a value indicating whether the <see cref="DynamicDictionary" /> is read-only.
	/// </summary>
	/// <returns>Always returns <see langword="false" />.</returns>
	public bool IsReadOnly => false;

	private static readonly Regex SplitRegex = new(@"(?<!\\)\.");

	/// <summary>
	/// Traverses data using path notation.
	/// <para><c>e.g some.deep.nested.json.path</c></para>
	/// <para></para>
	/// <para> A special lookup is available for ANY key <c>_arbitrary_key_</c> <c>e.g some.deep._arbitrary_key_.json.path</c> which will traverse into the first key</para>
	/// <para> If <c>_arbitrary_key_</c> is the last value it will return the key name</para>
	/// <para></para>
	/// </summary>
	/// <param name="path">path into the stored object, keys are separated with a dot and the last key is returned as T</param>
	/// <typeparam name="T"></typeparam>
	/// <returns>T or default</returns>
	public T Get<T>(string path)
	{
		if (path == null) return default;

		var split = SplitRegex.Split(path);
		var queue = new Queue<string>(split);
		if (queue.Count == 0) return default;

		var d = new DynamicValue(_backingDictionary);
		while (queue.Count > 0)
		{
			var key = queue.Dequeue().Replace(@"\.", ".");
			if (key == "_arbitrary_key_")
			{
				if (queue.Count > 0) d = d[0];
				else
				{
					var v = d?.ToDictionary()?.Keys.FirstOrDefault();
					d = v != null ? new DynamicValue(v) : DynamicValue.NullValue;
				}
			}
			else if (int.TryParse(key, out var i)) d = d[i];
			else d = d[key];
		}

		return d.TryParse<T>();
	}