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); }
/// <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. }