public void Map_GetSet_ByIndexer() { dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map); obj["A"] = 7; Aver.AreEqual(7, obj["A"]); }
public void Map_GetSet_ByMember() { dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map); obj.A = 7; Aver.AreEqual(7, obj.A); }
//[Fact(Skip = "System.TypeLoadException : The generic type 'System.IEquatable`1' was used with an invalid instantiation in assembly 'System.Private.CoreLib")] public void NonAllocatingRead() { JsonDynamicObject json = JsonDynamicObject.Parse(new Utf8Span("{\"First\":\"John\",\"Age\":25}")); Assert.Equal("John", json.First().ToString()); Assert.Equal(25U, json.Age()); }
public void NonAllocatingRead() { var jsonText = new Utf8String("{\"First\":\"John\",\"Age\":25}"); JsonDynamicObject json = JsonDynamicObject.Parse(jsonText); Assert.Equal(new Utf8String("John"), json.First()); Assert.Equal(25U, json.Age()); }
public static Utf8Span First(this JsonDynamicObject json) { if (json.TryGetString(new Utf8Span(s_first), out Utf8Span value)) { return(value); } throw new InvalidOperationException(); }
public static uint Age(this JsonDynamicObject json) { if (json.TryGetUInt32(new Utf8Span(s_age), out uint value)) { return(value); } throw new InvalidOperationException(); }
public static void JsonDynamicTypes_Serialize() { var options = new JsonSerializerOptions(); options.EnableDynamicTypes(); // Guid (string) string GuidJson = $"{DynamicTests.MyGuid.ToString("D")}"; string GuidJsonWithQuotes = $"\"{GuidJson}\""; dynamic dynamicString = new JsonDynamicString(GuidJson, options); Assert.Equal(DynamicTests.MyGuid, (Guid)dynamicString); string json = JsonSerializer.Serialize(dynamicString, options); Assert.Equal(GuidJsonWithQuotes, json); // char (string) dynamicString = new JsonDynamicString("a", options); Assert.Equal('a', (char)dynamicString); json = JsonSerializer.Serialize(dynamicString, options); Assert.Equal("\"a\"", json); // Number (JsonElement) using (JsonDocument doc = JsonDocument.Parse($"{decimal.MaxValue}")) { dynamic dynamicNumber = new JsonDynamicNumber(doc.RootElement, options); Assert.Equal <decimal>(decimal.MaxValue, (decimal)dynamicNumber); json = JsonSerializer.Serialize(dynamicNumber, options); Assert.Equal(decimal.MaxValue.ToString(), json); } // Boolean dynamic dynamicBool = new JsonDynamicBoolean(true, options); Assert.True(dynamicBool); json = JsonSerializer.Serialize(dynamicBool, options); Assert.Equal("true", json); // Array dynamic arr = new JsonDynamicArray(options); arr.Add(1); arr.Add(2); json = JsonSerializer.Serialize(arr, options); Assert.Equal("[1,2]", json); // Object dynamic dynamicObject = new JsonDynamicObject(options); dynamicObject["One"] = 1; dynamicObject["Two"] = 2; json = JsonSerializer.Serialize(dynamicObject, options); JsonTestHelper.AssertJsonEqual("{\"One\":1,\"Two\":2}", json); }
public void EagerWrite() { dynamic json = new JsonDynamicObject(); json.First = "John"; var formatter = new ArrayFormatter(1024, EncodingData.InvariantUtf8); formatter.Append((JsonDynamicObject)json); var formattedText = new Utf8String(formatter.Formatted); Assert.Equal(new Utf8String("{\"First\":\"John\"}"), formattedText); }
public void Map_GetSet_DoubleAddInt() { dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map); obj.A = 3.4d; obj.B = 5; obj.C = obj.A + obj.B; Aver.AreEqual(8.4d, obj.C); }
public void Map_GetSet_IntAdd() { dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map); obj.A = 3; obj.B = 5; obj.C = obj.A + obj.B; Aver.AreEqual(8, obj.C); }
public static Utf8String First(this JsonDynamicObject json) { Utf8String value; if (json.TryGetString(s_first, out value)) { return(value); } throw new InvalidOperationException(); }
public void Map_GetSet_DateTimeAddDays() { dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map); obj.StartDate = new DateTime(1980, 12, 05); obj.Interval = 5; obj.EndDate = obj.StartDate.AddDays(obj.Interval); Aver.AreEqual(new DateTime(1980, 12, 10), obj.EndDate); }
//[Fact(Skip = "System.TypeLoadException : The generic type 'System.IEquatable`1' was used with an invalid instantiation in assembly 'System.Private.CoreLib")] public void EagerWrite() { dynamic json = new JsonDynamicObject(); json.First = "John"; var formatter = new ArrayFormatter(1024, SymbolTable.InvariantUtf8); formatter.Append((JsonDynamicObject)json); Assert.Equal("{\"First\":\"John\"}", formatter.Formatted.ToString()); }
public void Array_Autogrow_2() { dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Array); Aver.AreEqual(0, obj.Count); Aver.AreEqual(0, obj.Length); obj[150] = 100; Aver.AreEqual(151, obj.Count); Aver.AreEqual(100, obj[150]); }
public void EagerWrite() { dynamic json = new JsonDynamicObject(); json.First = "John"; var formatter = new ArrayFormatter(1024, TextEncoder.Utf8); formatter.Append((JsonDynamicObject)json); var formattedText = new Utf8String(formatter.Formatted); Assert.Equal(new Utf8String("{\"First\":\"John\"}"), formattedText); }
//[Fact(Skip = "System.TypeLoadException : The generic type 'System.IEquatable`1' was used with an invalid instantiation in assembly 'System.Private.CoreLib")] public void NestedEagerWrite() { var jsonText = new Utf8Span("{\"FirstName\":\"John\",\"LastName\":\"Smith\",\"Address\":{\"Street\":\"21 2nd Street\",\"City\":\"New York\",\"State\":\"NY\",\"Zip\":\"10021-3100\"},\"IsAlive\":true,\"Age\":25,\"Spouse\":null}"); JsonDynamicObject json = JsonDynamicObject.Parse(jsonText, 100); var formatter = new ArrayFormatter(1024, SymbolTable.InvariantUtf8); formatter.Append(json); var formattedText = new Utf8Span(formatter.Formatted); // The follwoing check only works given the current implmentation of Dictionary. // If the implementation changes, the properties might round trip to different places in the JSON text. Assert.Equal(jsonText.ToString(), formattedText.ToString()); }
public void Array_GetBeyondRange() { dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Array); Aver.AreEqual(0, obj.Count); Aver.AreEqual(0, obj.Length); obj[0] = 100; obj[1] = 120; Aver.AreEqual(2, obj.Count); Aver.AreEqual(100, obj[0]); Aver.AreEqual(120, obj[1]); Aver.IsNull(obj[10001]); }
public void Map_GetMemberNames() { dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map); obj.A = 3; obj.B = 5; obj.C = obj.A + obj.B; IEnumerable <string> nms = obj.GetDynamicMemberNames(); var names = nms.ToList(); Aver.AreEqual(3, names.Count); Aver.AreEqual("A", names[0]); Aver.AreEqual("B", names[1]); Aver.AreEqual("C", names[2]); }
public override bool TryGetMember(GetMemberBinder binder, out object result) { if (_value.TryGetValue(binder.Name, out result)) { JsonDynamicObject dynamicObj = result as JsonDynamicObject; if (dynamicObj != null) { return(dynamicObj.TryConvert(binder.ReturnType, out result)); } return(true); } // Return null for missing properties. result = null; return(true); }
public static void VerifyMutableDom_WithoutUsingDynamicKeyword_JsonDynamicType() { var options = new JsonSerializerOptions(); options.EnableDynamicTypes(); JsonDynamicObject obj = (JsonDynamicObject)JsonSerializer.Deserialize <object>(DynamicTests.Json, options); Verify(); // Verify the values are round-trippable. ((JsonDynamicArray)obj["MyArray"]).RemoveAt(2); Verify(); void Verify() { // Change some primitives. ((JsonDynamicType)obj["MyString"]).SetValue("Hello!"); ((JsonDynamicType)obj["MyBoolean"]).SetValue(false); ((JsonDynamicType)obj["MyInt"]).SetValue(43); // Add nested objects. obj["MyObject"] = new JsonDynamicObject(options) { ["MyString"] = new JsonDynamicString("Hello!!", options) }; obj["Child"] = new JsonDynamicObject(options) { ["ChildProp"] = new JsonDynamicNumber(1, options) }; // Modify number elements. var arr = (JsonDynamicArray)obj["MyArray"]; ((JsonDynamicType)arr[0]).SetValue(2); ((JsonDynamicType)arr[1]).SetValue(3); // Add an element. arr.Add(new JsonDynamicNumber(42, options)); string json = JsonSerializer.Serialize(obj, options); JsonTestHelper.AssertJsonEqual(ExpectedDomJson, json); } }
public void WithSubDocumentsAndConversionAccessors() { // http://stackoverflow.com/questions/2954531/lots-of-first-chance-microsoft-csharp-runtimebinderexceptions-thrown-when-dealin dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map); obj.type = "abc"; obj.startDate = "5/15/2001 6:00pm"; obj.target = new JsonDynamicObject(JSONDynamicObjectKind.Map); obj.target.id = "A678"; obj.target.image = "hello"; obj.target.type = "good"; obj.target.description = "Thank You"; obj.target.Age = 123; obj.target.Salary = 125000m; string s1 = obj.ToJSON(); var ro1 = s1.JsonToDynamic(); Aver.AreEqual("abc", ro1.type); Aver.AreEqual(new DateTime(2001, 5, 15, 18, 00, 00), ((string)ro1.startDate).AsDateTime()); Aver.AreEqual("A678", ro1.target.id); Aver.AreEqual("hello", ro1.target.image); Aver.AreEqual("good", ro1.target.type); Aver.AreEqual("Thank You", ro1.target.description); Aver.AreEqual(123, ro1.target.Age); Aver.AreEqual(125000, ro1.target.Salary); string s2 = ((object)obj).ToJson(); var ro2 = s2.JsonToDynamic(); Aver.AreEqual("abc", ro2.type); Aver.AreEqual(new DateTime(2001, 5, 15, 18, 00, 00), ((string)ro2.startDate).AsDateTime()); Aver.AreEqual("A678", ro2.target.id); Aver.AreEqual("hello", ro2.target.image); Aver.AreEqual("good", ro2.target.type); Aver.AreEqual("Thank You", ro2.target.description); }
//[Fact(Skip = "System.TypeLoadException : The generic type 'System.IEquatable`1' was used with an invalid instantiation in assembly 'System.Private.CoreLib")] public void NestedEagerRead() { dynamic json = JsonDynamicObject.Parse(new Utf8Span("{ \"FirstName\": \"John\", \"LastName\": \"Smith\", \"Address\": { \"Street\": \"21 2nd Street\", \"City\": \"New York\", \"State\": \"NY\", \"Zip\": \"10021-3100\" }, \"IsAlive\": true, \"Age\": 25, \"Spouse\":null }")); Assert.Equal("John", json.FirstName); Assert.Equal("Smith", json.LastName); Assert.Equal(true, json.IsAlive); Assert.Equal(25, json.Age); Assert.Equal(null, json.Spouse); Assert.Equal(6, json.Count); dynamic address = json.Address; Assert.Equal("21 2nd Street", address.Street); Assert.Equal("New York", address.City); Assert.Equal("NY", address.State); Assert.Equal("10021-3100", address.Zip); Assert.Equal(4, address.Count); }
public static void VerifyMutableDom_UsingDynamicKeyword() { var options = new JsonSerializerOptions(); options.EnableDynamicTypes(); dynamic obj = JsonSerializer.Deserialize <dynamic>(DynamicTests.Json, options); Assert.IsType <JsonDynamicObject>(obj); // Change some primitives. obj.MyString = "Hello!"; obj.MyBoolean = false; obj.MyInt = 43; // Add nested objects. // Use JsonDynamicObject; ExpandoObject should not be used since it doesn't have the same semantics including // null handling and case-sensitivity that respects JsonSerializerOptions.PropertyNameCaseInsensitive. dynamic myObject = new JsonDynamicObject(options); myObject.MyString = "Hello!!"; obj.MyObject = myObject; dynamic child = new JsonDynamicObject(options); child.ChildProp = 1; obj.Child = child; // Modify number elements. dynamic arr = obj["MyArray"]; arr[0] = (int)arr[0] + 1; arr[1] = (int)arr[1] + 1; // Add an element. arr.Add(42); string json = JsonSerializer.Serialize(obj, options); JsonTestHelper.AssertJsonEqual(ExpectedDomJson, json); }
public static void VerifyMutableDom_WithoutUsingDynamicKeyword() { var options = new JsonSerializerOptions(); options.EnableDynamicTypes(); JsonDynamicObject obj = (JsonDynamicObject)JsonSerializer.Deserialize <object>(DynamicTests.Json, options); // Change some primitives. obj["MyString"] = "Hello!"; obj["MyBoolean"] = false; obj["MyInt"] = 43; // Add nested objects. obj["MyObject"] = new JsonDynamicObject(options) { ["MyString"] = "Hello!!" }; obj["Child"] = new JsonDynamicObject(options) { ["ChildProp"] = 1 }; // Modify number elements. var arr = (JsonDynamicArray)obj["MyArray"]; var elem = (JsonDynamicNumber)arr[0]; elem.SetValue(elem.GetValue <int>() + 1); elem = (JsonDynamicNumber)arr[1]; elem.SetValue(elem.GetValue <int>() + 1); // Add an element. arr.Add(42); string json = JsonSerializer.Serialize(obj, options); JsonTestHelper.AssertJsonEqual(ExpectedDomJson, json); }
public object Toc(string uriPattern = null, string typePattern = null) { dynamic data = JsonDynamicObject.NewMap(); data.scopes = Data.Children .Where(nscope => nscope.IsSameName("scope") && (uriPattern.IsNullOrWhiteSpace() || nscope.AttrByName("uri-base").Value.MatchPattern(uriPattern))) .OrderBy(nscope => nscope.AttrByName("uri-base").Value) .Select(nscope => { dynamic d = JsonDynamicObject.NewMap(); d.uri = nscope.ValOf("uri-base"); d.id = nscope.ValOf("run-id"); d.title = nscope.ValOf("title"); d.descr = nscope.ValOf("description"); d.endpoints = nscope.Children .Where(nep => nep.IsSameName("endpoint")) .Select(nep => nep.ToDynOfAttrs("uri", "title", "run-id->id")) .ToArray(); return(d); }); data.docs = Data["type-schemas"].Children .Where(nts => { var sku = nts.AttrByName("sku").Value; if (sku.IsNullOrWhiteSpace()) { return(false); } if (!nts["data-doc"].Exists) { return(false); } return(typePattern.IsNullOrWhiteSpace() || sku.MatchPattern(typePattern)); }) .OrderBy(nts => nts.AttrByName("sku").Value) .Select(nts => { dynamic d = JsonDynamicObject.NewMap(); d.id = nts.Name; d.sku = nts.ValOf("sku"); return(d); }); data.perms = Data["type-schemas"].Children .Where(nts => { var sku = nts.AttrByName("sku").Value; if (sku.IsNullOrWhiteSpace()) { return(false); } if (!nts["permission"].Exists) { return(false); } return(typePattern.IsNullOrWhiteSpace() || sku.MatchPattern(typePattern)); }) .OrderBy(nts => nts.AttrByName("sku").Value) .Select(nts => { dynamic d = JsonDynamicObject.NewMap(); d.id = nts.Name; d.sku = nts.ValOf("sku"); return(d); }); if (WorkContext.RequestedJson) { return(new JsonResult(data, JsonWritingOptions.PrettyPrintRowsAsMap)); } return(TocView(data)); }