Represents the built-in javascript Array object.
Inheritance: ClrStubFunction
Ejemplo n.º 1
0
        public static object Stringify(ScriptEngine engine, object value, object replacer = null, object spacer = null)
        {
            var serializer = new JSONSerializer(engine);

            // The replacer object can be either a function or an array.
            serializer.ReplacerFunction = replacer as FunctionInstance;
            if (replacer is ObjectInstance replaceObjectInstance && ArrayConstructor.IsArray(replacer))
            {
                var serializableProperties = new HashSet <string>(StringComparer.Ordinal);
                foreach (object elementValue in TypeUtilities.CreateListFromArrayLike(replaceObjectInstance))
                {
                    if (elementValue is string || elementValue is int || elementValue is uint || elementValue is double || elementValue is StringInstance || elementValue is NumberInstance)
                    {
                        serializableProperties.Add(TypeConverter.ToString(elementValue));
                    }
                }
                serializer.SerializableProperties = serializableProperties;
            }

            // The spacer argument can be the number of spaces or a string.
            if (spacer is NumberInstance)
            {
                spacer = ((NumberInstance)spacer).Value;
            }
            else if (spacer is StringInstance)
            {
                spacer = ((StringInstance)spacer).Value;
            }
            if (spacer is double)
            {
                serializer.Indentation = new string(' ', Math.Max(Math.Min(TypeConverter.ToInteger((double)spacer), 10), 0));
            }
            else if (spacer is int || spacer is uint)
            {
                serializer.Indentation = new string(' ', Math.Max(Math.Min(TypeConverter.ToInteger(spacer), 10), 0));
            }
            else if (spacer is string)
            {
                serializer.Indentation = ((string)spacer).Substring(0, Math.Min(((string)spacer).Length, 10));
            }

            // Serialize the value.
            return(serializer.Serialize(value) ?? (object)Undefined.Value);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Serializes a value into a JSON string.  Does not serialize "undefined", check for that
        /// value before calling this method.
        /// </summary>
        /// <param name="value"> The value to serialize. </param>
        /// <param name="result"> The StringBuilder to write the JSON representation of the
        /// value to. </param>
        private void SerializePropertyValue(object value, StringBuilder result)
        {
            // Transform boolean, numeric and string objects into their primitive equivalents.
            if (value is NumberInstance)
            {
                value = ((NumberInstance)value).Value;
            }
            else if (value is StringInstance)
            {
                value = ((StringInstance)value).Value;
            }
            else if (value is BooleanInstance)
            {
                value = ((BooleanInstance)value).Value;
            }

            // Serialize a null value.
            if (value == Null.Value)
            {
                result.Append("null");
                return;
            }

            // Serialize a boolean value.
            if (value is bool)
            {
                if ((bool)value == false)
                {
                    result.Append("false");
                }
                else
                {
                    result.Append("true");
                }
                return;
            }

            // Serialize a string value.
            if (value is string || value is ConcatenatedString)
            {
                QuoteString(value.ToString(), result);
                return;
            }

            // Serialize a numeric value.
            if (value is double)
            {
                if (double.IsInfinity((double)value) == true || double.IsNaN((double)value))
                {
                    result.Append("null");
                }
                else
                {
                    result.Append(NumberFormatter.ToString((double)value, 10, NumberFormatter.Style.Regular));
                }
                return;
            }
            if (value is int)
            {
                result.Append(((int)value).ToString());
                return;
            }

            // Serialize an array.
            if (value is ObjectInstance valueObjectInstance && ArrayConstructor.IsArray(value))
            {
                SerializeArray(valueObjectInstance, result);
                return;
            }

            // Serialize an object.
            if (value is ObjectInstance && (value is FunctionInstance) == false)
            {
                SerializeObject((ObjectInstance)value, result);
                return;
            }

            // The value is of a type we cannot serialize.
        }