internal JToken ConvertBack(JTokenType type, JsValue value) { switch (type) { case JTokenType.Array: if (value.IsArray()) { var array = value.AsArray(); return(new JArray(array.Properties.Where(k => ArrayInstance.IsArrayIndex(new JsValue(k.Key))).Select(kvp => ConvertBack(kvp.Value.Value ?? JsValue.Null)))); } break; case JTokenType.Boolean: if (value.IsBoolean()) { return(new JValue(value.AsBoolean())); } break; case JTokenType.Date: if (value.IsDate()) { return(new JValue(value.AsDate())); } break; case JTokenType.Float: if (value.IsNumber()) { return(new JValue((float)value.AsNumber())); } break; case JTokenType.Integer: if (value.IsNumber()) { return(new JValue((int)value.AsNumber())); } break; case JTokenType.String: if (value.IsString()) { return(JValue.CreateString(value.AsString())); } break; } return(ConvertBack(value)); }
public void ShouldBeADate() { var value = new JsValue(new DateInstance(null)); Assert.Equal(false, value.IsBoolean()); Assert.Equal(false, value.IsArray()); Assert.Equal(true, value.IsDate()); Assert.Equal(false, value.IsNull()); Assert.Equal(false, value.IsNumber()); Assert.Equal(true, value.IsObject()); Assert.Equal(false, value.IsPrimitive()); Assert.Equal(false, value.IsRegExp()); Assert.Equal(false, value.IsString()); Assert.Equal(false, value.IsUndefined()); Assert.Equal(true, value.AsDate() != null); }
public void SetValue(JsValue arg) { switch (arg.Type) { case Types.Boolean: Cell.SetCellValue(arg.AsBoolean()); break; case Types.String: Cell.SetCellValue(arg.AsString()); break; case Types.Number: Cell.SetCellValue(arg.AsNumber()); break; case Types.Object: if (arg.IsDate()) { Cell.SetCellValue(arg.AsDate().ToDateTime()); } else { double?value = arg.ConvertToDouble(); if (value.HasValue) { Cell.SetCellValue(value.Value); } else { Cell.SetCellValue((string)null); } } break; default: Cell.SetCellValue((string)null); break; } }
public static JToken Map(JsValue value) { if (value == null || value.IsNull()) { return(JValue.CreateNull()); } if (value.IsUndefined()) { return(JValue.CreateUndefined()); } if (value.IsString()) { return(new JValue(value.AsString())); } if (value.IsBoolean()) { return(new JValue(value.AsBoolean())); } if (value.IsNumber()) { return(new JValue(value.AsNumber())); } if (value.IsDate()) { return(new JValue(value.AsDate().ToDateTime())); } if (value.IsRegExp()) { return(JValue.CreateString(value.AsRegExp().Value?.ToString())); } if (value.IsArray()) { var arr = value.AsArray(); var target = new JArray(); for (var i = 0; i < arr.GetLength(); i++) { target.Add(Map(arr.Get(i.ToString()))); } return(target); } if (value.IsObject()) { var obj = value.AsObject(); var target = new JObject(); foreach (var kvp in obj.GetOwnProperties()) { target[kvp.Key] = Map(kvp.Value.Value); } return(target); } throw new ArgumentException("Invalid json type.", nameof(value)); }
private object ToBlittableValue(JsValue v, string propertyKey, bool recursiveCall) { if (v.IsBoolean()) { return(v.AsBoolean()); } if (v.IsString()) { const string RavenDataByteArrayToBase64 = "raven-data:byte[];base64,"; var valueAsObject = v.ToObject(); var value = valueAsObject?.ToString(); if (value != null && value.StartsWith(RavenDataByteArrayToBase64)) { value = value.Remove(0, RavenDataByteArrayToBase64.Length); var byteArray = Convert.FromBase64String(value); return(Encoding.UTF8.GetString(byteArray)); } return(value); } if (v.IsNumber()) { var num = v.AsNumber(); KeyValuePair <object, JsValue> property; if (_propertiesByValue.TryGetValue(propertyKey, out property)) { var originalValue = property.Key; if (originalValue is float || originalValue is int) { // If the current value is exactly as the original value, we can return the original value before we made the JS conversion, // which will convert a Int64 to jsFloat. var jsValue = property.Value; if (jsValue.IsNumber() && Math.Abs(num - jsValue.AsNumber()) < double.Epsilon) { return(originalValue); } //We might have change the type of num from Integer to long in the script by design //Making sure the number isn't a real float before returning it as integer if (originalValue is int && (Math.Abs(num - Math.Floor(num)) <= double.Epsilon || Math.Abs(num - Math.Ceiling(num)) <= double.Epsilon)) { return((long)num); } return(num); //float } } // If we don't have the type, assume that if the number ending with ".0" it actually an integer. var integer = Math.Truncate(num); if (Math.Abs(num - integer) < double.Epsilon) { return((long)integer); } return(num); } if (v.IsNull() || v.IsUndefined()) { return(null); } if (v.IsArray()) { var jsArray = v.AsArray(); var array = new DynamicJsonArray(); foreach (var property in jsArray.GetOwnProperties()) { if (InheritedProperties.Contains(property.Key)) { continue; } var jsInstance = property.Value.Value; if (!jsInstance.HasValue) { continue; } var ravenJToken = ToBlittableValue(jsInstance.Value, propertyKey + "[" + property.Key + "]", recursiveCall); if (ravenJToken == null) { continue; } array.Add(ravenJToken); } return(array); } if (v.IsDate()) { return(v.AsDate().ToDateTime()); } if (v.IsObject()) { return(ToBlittable(v.AsObject(), propertyKey, recursiveCall)); } if (v.IsRegExp()) { return(null); } throw new NotSupportedException(v.Type.ToString()); }
private static object GetValue(JsValue jsValue) { if (jsValue.IsNull()) { return(null); } if (jsValue.IsString()) { return(jsValue.AsString()); } if (jsValue.IsBoolean()) { return(jsValue.AsBoolean()); } if (jsValue.IsNumber()) { return(jsValue.AsNumber()); } if (jsValue.IsDate()) { return(jsValue.AsDate()); } if (jsValue is ObjectWrapper ow) { var target = ow.Target; switch (target) { case LazyStringValue lsv: return(lsv); case LazyCompressedStringValue lcsv: return(lcsv); case LazyNumberValue lnv: return(lnv); //should be already blittable supported type. } ThrowInvalidObject(jsValue); } else if (jsValue.IsArray()) { var arr = jsValue.AsArray(); var array = new object[arr.GetLength()]; var i = 0; foreach ((var key, var val) in arr.GetOwnProperties()) { if (key == "length") { continue; } array[i++] = GetValue(val.Value); } return(array); } else if (jsValue.IsObject()) { return(jsValue.AsObject()); } if (jsValue.IsUndefined()) { return(null); } ThrowInvalidObject(jsValue); return(null); }
private LocalVariable GetLocalVariableJS(string key, JsValue value) { var result = new LocalVariable() { Name = key, TypeName = value.Type.ToString() }; if (value.IsArray()) { var trueValue = value.AsArray(); if (trueValue.GetLength() > 0) { var props = trueValue.GetOwnProperties(); foreach (var item in props) { var ch = GetLocalVariableJS(item.Key, item.Value.Value); result.Children.Add(ch); } } //result.Value=trueValue. } else if (value.IsBoolean()) { var trueValue = value.AsBoolean(); result.Value = trueValue.ToString(); } else if (value.IsDate()) { var trueValue = value.AsDate(); result.Value = trueValue.ToDateTime().ToString("yyyy-MM-dd HH:mm:ss"); } else if (value.IsNumber()) { var trueValue = value.AsNumber(); result.Value = trueValue.ToString(); } else if (value.IsString()) { var trueValue = value.AsString(); result.Value = trueValue; } else if (value.IsObject()) { var trueValue = value.AsObject(); //判断对象是否原生JS if (trueValue.GetType().Name == "ObjectInstance") { var props = trueValue.GetOwnProperties(); foreach (var item in props) { var ch = GetLocalVariableJS(item.Key, item.Value.Value); result.Children.Add(ch); } } else { var csharpValue = value.ToObject(); if (csharpValue != null) { //只处理DapperRow result = GetLocalVariableCSharp(key, csharpValue); //csharpValue. } } } return(result); }
public static IJsonValue Map(JsValue value) { if (value == null || value.IsNull() || value.IsUndefined()) { return(JsonValue.Null); } if (value.IsString()) { return(JsonValue.Create(value.AsString())); } if (value.IsBoolean()) { return(JsonValue.Create(value.AsBoolean())); } if (value.IsNumber()) { return(JsonValue.Create(value.AsNumber())); } if (value.IsDate()) { return(JsonValue.Create(value.AsDate().ToString())); } if (value.IsRegExp()) { return(JsonValue.Create(value.AsRegExp().Value?.ToString())); } if (value.IsArray()) { var arr = value.AsArray(); var result = JsonValue.Array(); for (var i = 0; i < arr.GetLength(); i++) { result.Add(Map(arr.Get(i.ToString()))); } return(result); } if (value.IsObject()) { var obj = value.AsObject(); var result = JsonValue.Object(); foreach (var kvp in obj.GetOwnProperties()) { result[kvp.Key] = Map(kvp.Value.Value); } return(result); } throw new ArgumentException("Invalid json type.", nameof(value)); }