/// <summary> /// For object constructed in JS, we need to create a C# representation and bind it to that /// object. For this, we'll use a <see cref="Dictionary{TKey,TValue}"/>. Possibly a later addition /// could use a custom serialization process and allow the user to control. /// </summary> private Dictionary <string, object> NewHostObject(JavaScriptValue arg) { // Create new Dictionary mapping to hold the properties, Create a new bindable JS object to replace // the existing one. Note: This could cause issues if these objects are used as keys. var d = new Dictionary <string, object>(); var replacement = _binder.BindObject(d); var propNames = (string[])ToHostArray(arg.GetOwnPropertyNames(), typeof(string[])); for (var i = 0; i < propNames.Length; ++i) { var propName = propNames[i]; var propId = JavaScriptPropertyId.FromString(propName); var jsProp = arg.GetProperty(propId); // Copy Properties into Replacement replacement.SetProperty(propId, jsProp, true); Type propType; if (!TryInferType(jsProp, out propType)) { throw new Exception($"Failed to create Host representation of JS object. Property: {propName}"); } d[propName] = ToHostObject(jsProp, propType); } return(d); }
private string JSValueToString(JavaScriptValue val) { switch (val.ValueType) { case JavaScriptValueType.Boolean: return(val.ToBoolean() ? "true" : "false"); case JavaScriptValueType.Number: try { return(val.ToInt32().ToString()); } catch (JavaScriptException) { return(val.ToDouble().ToString(CultureInfo.InvariantCulture)); } case JavaScriptValueType.Error: var keys = val.GetOwnPropertyNames(); throw new Exception("Error in js"); case JavaScriptValueType.String: return(val.ToString()); case JavaScriptValueType.Array: // int length = val.GetProperty(JavaScriptPropertyId.FromString("length")).ToInt32(); // return "Array"; case JavaScriptValueType.Object: return(val.ToJsonString()); default: return(val.ValueType.ToString()); } }
private ShibaObject VisitJavascriptObject(JavaScriptValue value) { var propers = VisitJavascriptArray(value.GetOwnPropertyNames()).Cast <string>().ToList(); var obj = new ShibaObject(); foreach (var name in propers) { obj.TryAdd(name, Visit(value.GetProperty(name.ToJavaScriptPropertyId()), null)); } return(obj); }
private JToken VisitObject(JavaScriptValue value) { var jsonObject = new JObject(); var properties = Visit(value.GetOwnPropertyNames()).ToObject <string[]>(); foreach (var property in properties) { var propertyId = JavaScriptPropertyId.FromString(property); var propertyValue = value.GetProperty(propertyId); jsonObject.Add(property, Visit(propertyValue)); } return(jsonObject); }
private static object ConvertJavaScriptValue(JavaScriptValue value) { JavaScriptValueType t = value.ValueType; if (t == JavaScriptValueType.Boolean) { return(value.ToBoolean()); } else if (t == JavaScriptValueType.Number) { return(value.ToDouble()); } else if (t == JavaScriptValueType.String) { return(value.ToString()); } else if (t == JavaScriptValueType.Null) { return(null); } else if (t == JavaScriptValueType.Undefined) { return(null); } else if (t == JavaScriptValueType.Object) { Dictionary <string, object> dictionary = new Dictionary <string, object>(); JavaScriptValue propNames = value.GetOwnPropertyNames(); int i = 0; JavaScriptValue index; while (propNames.HasIndexedProperty(index = JavaScriptValue.FromInt32(i))) { JavaScriptValue propName = propNames.GetIndexedProperty(index); JavaScriptPropertyId propId = JavaScriptPropertyId.FromString(propName.ToString()); JavaScriptValue propValue = value.GetProperty(propId); object value2 = ConvertJavaScriptValue(propValue); dictionary.Add(propName.ToString(), value2); //Debug.WriteLine(propName.ToString() + ": " + propValue.ConvertToString().ToString()); i += 1; } return(dictionary); } else if (t == JavaScriptValueType.Array) { JavaScriptPropertyId lengthPropId = JavaScriptPropertyId.FromString("length"); JavaScriptValue arrayLength = value.GetProperty(lengthPropId); int length = (int)arrayLength.ToDouble(); object[] array = new object[length]; int i; JavaScriptValue index; for (i = 0; i < length; i++) { if (value.HasIndexedProperty(index = JavaScriptValue.FromInt32(i))) { JavaScriptValue prop = value.GetIndexedProperty(index); array[i] = ConvertJavaScriptValue(prop); } } return(array); } return(null); }
private JToken VisitObject(JavaScriptValue value) { var jsonObject = new JObject(); var properties = Visit(value.GetOwnPropertyNames()).ToObject<string[]>(); foreach (var property in properties) { var propertyId = JavaScriptPropertyId.FromString(property); var propertyValue = value.GetProperty(propertyId); jsonObject.Add(property, Visit(propertyValue)); } return jsonObject; }