示例#1
0
        public void Map_GetSet_ByIndexer()
        {
            dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map);

            obj["A"] = 7;
            Aver.AreEqual(7, obj["A"]);
        }
示例#2
0
        public void Map_GetSet_ByMember()
        {
            dynamic obj = new JsonDynamicObject(JSONDynamicObjectKind.Map);

            obj.A = 7;
            Aver.AreEqual(7, obj.A);
        }
示例#3
0
        //[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());
        }
示例#4
0
        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());
        }
示例#5
0
 public static Utf8Span First(this JsonDynamicObject json)
 {
     if (json.TryGetString(new Utf8Span(s_first), out Utf8Span value))
     {
         return(value);
     }
     throw new InvalidOperationException();
 }
示例#6
0
 public static uint Age(this JsonDynamicObject json)
 {
     if (json.TryGetUInt32(new Utf8Span(s_age), out uint value))
     {
         return(value);
     }
     throw new InvalidOperationException();
 }
示例#7
0
        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);
        }
示例#9
0
        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);
        }
示例#10
0
        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);
        }
示例#11
0
        public static Utf8String First(this JsonDynamicObject json)
        {
            Utf8String value;

            if (json.TryGetString(s_first, out value))
            {
                return(value);
            }
            throw new InvalidOperationException();
        }
示例#12
0
        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);
        }
示例#13
0
        //[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());
        }
示例#14
0
        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]);
        }
示例#15
0
        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);
        }
示例#16
0
        //[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());
        }
示例#17
0
        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]);
        }
示例#18
0
        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]);
        }
示例#19
0
            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);
            }
示例#20
0
        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);
            }
        }
示例#21
0
        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);
        }
示例#22
0
        //[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);
        }
示例#23
0
        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);
        }
示例#24
0
        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);
        }
示例#25
0
        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));
        }