/// <summary>
        /// Reads the value from the <paramref name="jsonReader"/>
        /// </summary>
        /// <param name="jsonReader">The <see cref="IJsonReader"/> to read from.</param>
        /// <returns>The <see cref="IJsonValue"/> read.</returns>
        public static IJsonValue ReadAsJsonValue(this IJsonReader jsonReader)
        {
            //EdmUtil.CheckArgumentNull(jsonReader, "jsonReader");

            // Supports to read from Begin
            if (jsonReader.NodeKind == JsonNodeKind.None)
            {
                jsonReader.Read();
            }

            // Be noted: Json reader already verifies that value should be 'start array, start object or primitive value'
            // For any others, Json reader throws. So we don't care about other Node types.
            Debug.Assert(
                jsonReader.NodeKind == JsonNodeKind.StartArray ||
                jsonReader.NodeKind == JsonNodeKind.StartObject ||
                jsonReader.NodeKind == JsonNodeKind.PrimitiveValue,
                "json reader node type should be either start array, start object, or primitive value");

            if (jsonReader.NodeKind == JsonNodeKind.StartArray)
            {
                return(jsonReader.ReadAsArray());
            }
            else if (jsonReader.NodeKind == JsonNodeKind.StartObject)
            {
                return(jsonReader.ReadAsObject());
            }

            return(jsonReader.ReadAsPrimitive());
        }