예제 #1
0
 public JsonSerializerOptionsState(JsonSerializerOptions options)
 {
     ObjectMappingRegistry           = new ObjectMappingRegistry(options);
     ObjectMappingConventionRegistry = new ObjectMappingConventionRegistry();
     DiscriminatorConventionRegistry = new DiscriminatorConventionRegistry(options);
     DictionaryKeyConverterRegistry  = new DictionaryKeyConverterRegistry(options);
 }
예제 #2
0
        static TelescopeConverter()
        {
            options = new JsonSerializerOptions()
            {
                WriteIndented = true,
            };
            options.SetupExtensions();

            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.DiscriminatorPolicy = DiscriminatorPolicy.Always;

            // Cell types
            registry.RegisterConvention(new DefaultDiscriminatorConvention <string>(options, "cell_type"));
            registry.RegisterType <CodeCell>();
            registry.RegisterType <MarkdownCell>();
            registry.RegisterType <RawCell>();

            // Cell output types
            registry.RegisterConvention(new DefaultDiscriminatorConvention <string>(options, "output_type"));
            registry.RegisterType <DataOutput>();
            registry.RegisterType <ErrorOutput>();
            registry.RegisterType <ExecuteResultOutput>();
            registry.RegisterType <StreamOutput>();
        }
예제 #3
0
        public void WritePolymorphicObject(DiscriminatorPolicy discriminatorPolicy, string expected)
        {
            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.RegisterConvention(new DefaultDiscriminatorConvention <int>(options));
            registry.RegisterType <NameObject>();
            registry.DiscriminatorPolicy = discriminatorPolicy;

            BaseObjectHolder obj = new BaseObjectHolder
            {
                BaseObject = new NameObject
                {
                    Id   = 1,
                    Name = "foo"
                },
                NameObject = new NameObject
                {
                    Id   = 2,
                    Name = "bar"
                }
            };

            string actual = JsonSerializer.Serialize(obj, options);

            Assert.Equal(expected, actual);
        }
예제 #4
0
        public static void ConfigJsonOptions(JsonSerializerOptions options)
        {
            options.Converters.Add(new ObjectIdConverter());
            options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

            options.SetupExtensions();

            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.RegisterConvention(new DefaultDiscriminatorConvention <string>(options, "_t"));
            registry.RegisterType <TextMsg>();
            registry.RegisterType <FileMsg>();
            registry.RegisterType <ImageMsg>();
            registry.RegisterType <RTextMsg>();
            registry.RegisterType <RImageMsg>();
            registry.RegisterType <RFileMsg>();
            registry.RegisterType <RForwardMsg>();
            registry.RegisterType <WsSendChatMsg>();
            registry.RegisterType <WsSendOnlineStatusMsg>();
            registry.RegisterType <WsSendUnreadCountMsg>();
            registry.RegisterType <WsSendErrMsg>();
            registry.RegisterType <WsRecvChatMsg>();
            registry.RegisterType <WsRecvReadPositionMsg>();
            registry.DiscriminatorPolicy = DiscriminatorPolicy.Always;

            options.IgnoreNullValues    = true;
            options.AllowTrailingCommas = true;
            options.ReadCommentHandling = JsonCommentHandling.Skip;
        }
 public SerializationRegistry(CborOptions options)
 {
     ConverterRegistry               = new CborConverterRegistry(options);
     ObjectMappingRegistry           = new ObjectMappingRegistry(this);
     ObjectMappingConventionRegistry = new ObjectMappingConventionRegistry();
     DiscriminatorConventionRegistry = new DiscriminatorConventionRegistry(this);
 }
예제 #6
0
        private static JsonSerializerOptions CreateJsonSerializerOptions()
        {
            var options = new JsonSerializerOptions
            {
                MaxDepth         = int.MaxValue,
                Converters       = { new JsonStringEnumConverter() },
                IgnoreNullValues = true
            };

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.RegisterConvention(new TonClientDiscriminatorConvention(options));
            registry.DiscriminatorPolicy = DiscriminatorPolicy.Always;

            var nestedTypes = typeof(Abi.Contract).Assembly.GetTypes().Where(t => t.IsNestedPublic);

            // register all nested types from models
            foreach (Type type in nestedTypes)
            {
                registry.RegisterType(type);
            }

            return(options);
        }
예제 #7
0
        public void TestWrite()
        {
            JsonSerializerOptions           options  = new JsonSerializerOptions().SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.RegisterConvention(new DefaultDiscriminatorConvention <string>(options, "$type"));
            registry.RegisterType <MessageResult>();
            registry.RegisterType <StatusResult>();

            const string json1     = "{\"data\":{\"$type\":\"message\",\"message_id\":770,\"message_content\":1},\"id\":\"6nd28c1\",\"status\":\"ok\"}";
            Response     response1 = JsonSerializer.Deserialize <Response>(json1, options);

            Assert.NotNull(response1);
            Assert.Equal("6nd28c1", response1.Id);
            Assert.Equal("ok", response1.Status);
            Assert.NotNull(response1.Data);
            MessageResult messageResult = Assert.IsType <MessageResult>(response1.Data);

            Assert.Equal(770, messageResult.MessageId);
            Assert.Equal(1, messageResult.Content);

            const string json2     = "{\"data\":{\"$type\":\"status\",\"status_id\":12},\"id\":\"6nd28c1\",\"status\":\"ok\"}";
            Response     response2 = JsonSerializer.Deserialize <Response>(json2, options);

            Assert.NotNull(response2);
            Assert.Equal("6nd28c1", response2.Id);
            Assert.Equal("ok", response2.Status);
            Assert.NotNull(response2.Data);
            StatusResult statusResult = Assert.IsType <StatusResult>(response2.Data);

            Assert.Equal(12, statusResult.StatusId);
        }
예제 #8
0
        public void ReadWithNoDiscriminator()
        {
            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();

            const string json = @"{""Name"":""foo"",""Id"":12}";
            BaseObject   obj  = JsonSerializer.Deserialize <BaseObject>(json, options);

            Assert.NotNull(obj);
            Assert.Equal(12, obj.Id);
        }
        public void ReadPolymorphicObjectWithDefaultDiscriminatorConvention()
        {
            const string hexBuffer = "A2625F7478374461686F6D65792E43626F722E54657374732E426173654F626A656374486F6C6465722C204461686F6D65792E43626F722E54657374736A426173654F626A656374A3625F746A4E616D654F626A656374644E616D6563666F6F62496401";

            CborOptions options = new CborOptions();
            DiscriminatorConventionRegistry registry = options.Registry.DiscriminatorConventionRegistry;

            registry.RegisterConvention(new AttributeBasedDiscriminatorConvention <string>(options.Registry));
            registry.RegisterType <NameObject>();

            object obj = Helper.Read <object>(hexBuffer, options);

            Assert.NotNull(obj);
            Assert.IsType <BaseObjectHolder>(obj);
        }
예제 #10
0
        public void ReadNonAssignablePolymorphicObject()
        {
            const string json = @"{""BaseObject"":{""$type"":13}}";

            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.RegisterConvention(new DefaultDiscriminatorConvention <int>(options));
            registry.RegisterType <NameObject>();
            registry.RegisterType <OtherObject>();

            Assert.ThrowsAny <JsonException>(() => JsonSerializer.Deserialize <BaseObjectHolder>(json, options));
        }
        public void WriteWithNoDiscriminatorConvention()
        {
            CborOptions options = new CborOptions();
            DiscriminatorConventionRegistry registry = options.Registry.DiscriminatorConventionRegistry;

            registry.ClearConventions();

            NameObject obj = new NameObject
            {
                Id   = 12,
                Name = "foo"
            };

            const string hexBuffer = "A2644E616D6563666F6F6249640C";

            Helper.TestWrite(obj, hexBuffer, null, options);
        }
        public void ReadPolymorphicObjectWithDefaultDiscriminatorConvention()
        {
            const string json = @"{""$type"":""Dahomey.Json.Tests.BaseObjectHolder, Dahomey.Json.Tests"",""BaseObject"":{""$type"":12,""Name"":""foo"",""Id"":1}}";

            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.RegisterConvention(new AttributeBasedDiscriminatorConvention <int>(options));
            registry.RegisterType <NameObject>();

            object obj = JsonSerializer.Deserialize <object>(json, options);

            Assert.NotNull(obj);
            Assert.IsType <BaseObjectHolder>(obj);
        }
예제 #13
0
        public void Test()
        {
            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.RegisterType <InheritedClass>();

            const string json = @"{""$type"":""InheritedClass"",""Id"":12,""Name"":""foo"",""Age"":13}";

            BaseClass obj = Helper.Read <BaseClass>(json, options);

            Assert.NotNull(obj);
            Assert.Equal(12, obj.Id);
            Assert.Equal("foo", obj.Name);
            Assert.Equal(13, obj.Age);
        }
예제 #14
0
        public void ReadWithCustomDiscriminator()
        {
            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.RegisterConvention(new CustomDiscriminatorConvention());
            registry.RegisterType(typeof(NameObject2));

            const string      json = @"{""BaseObject"":{""type"":263970807,""Name"":""foo"",""Id"":1}}";
            BaseObjectHolder2 obj  = JsonSerializer.Deserialize <BaseObjectHolder2>(json, options);

            Assert.NotNull(obj);
            Assert.IsType <NameObject2>(obj.BaseObject);
            Assert.Equal("foo", ((NameObject2)obj.BaseObject).Name);
            Assert.Equal(1, obj.BaseObject.Id);
        }
        public void ReadPolymorphicObject()
        {
            const string json = @"{""BaseObject"":{""$type"":12,""Name"":""foo"",""Id"":1}}";

            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.RegisterConvention(new AttributeBasedDiscriminatorConvention <int>(options));
            registry.RegisterType <NameObject>();

            BaseObjectHolder obj = JsonSerializer.Deserialize <BaseObjectHolder>(json, options);

            Assert.NotNull(obj);
            Assert.IsType <NameObject>(obj.BaseObject);
            Assert.Equal("foo", ((NameObject)obj.BaseObject).Name);
            Assert.Equal(1, obj.BaseObject.Id);
        }
예제 #16
0
        public void TestPolymorphicMissingMemberHandlingIgnore()
        {
            JsonSerializerOptions options = new JsonSerializerOptions().SetupExtensions();

            options.SetMissingMemberHandling(MissingMemberHandling.Ignore);

            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.RegisterConvention(new DefaultDiscriminatorConvention <string>(options, "Type"));
            registry.RegisterType <Derived>();

            const string json = @"{""Type"":""Derived"",""Int"":42,""String"":""xyz"",""Missing"":0}";
            var          obj  = JsonSerializer.Deserialize <Base>(json, options);

            Assert.NotNull(obj);
            Assert.IsType <Derived>(obj);
            Assert.Equal(42, obj.Int);
            Assert.Equal("xyz", (obj as Derived).String);
        }
예제 #17
0
        public void WriteWithNoDiscriminatorConvention()
        {
            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();

            NameObject obj = new NameObject
            {
                Id   = 12,
                Name = "foo"
            };

            string       actual   = JsonSerializer.Serialize <BaseObject>(obj, options);
            const string expected = @"{""Name"":""foo"",""Id"":12}";

            Assert.Equal(expected, actual);
        }
예제 #18
0
        public void ReadPolymorphicObjectWithDeferredTypeProperty()
        {
            const string json = @"{""BaseObject"":{""Name"":""foo"",""Id"":1,""Unknown"":{""Prop1"":12,""Prop2"":""bar""},""$type"":12}}";

            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.RegisterConvention(new DefaultDiscriminatorConvention <int>(options));
            registry.RegisterType <NameObject>();

            BaseObjectHolder obj = JsonSerializer.Deserialize <BaseObjectHolder>(json, options);

            Assert.NotNull(obj);
            NameObject nameObject = Assert.IsType <NameObject>(obj.BaseObject);

            Assert.Equal("foo", nameObject.Name);
            Assert.Equal(1, nameObject.Id);
        }
예제 #19
0
        public void Test()
        {
            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.ClearConventions();
            registry.RegisterConvention(new DefaultDiscriminatorConvention <string>(options, "Tag"));
            registry.RegisterType <Box>();
            registry.RegisterType <Circle>();

            Shape origin1 = new Box {
                Width = 10, Height = 20
            };
            Shape origin2 = new Circle {
                Radius = 30
            };

            string json1 = JsonSerializer.Serialize(origin1, options);
            string json2 = JsonSerializer.Serialize(origin2, options);

            Assert.Equal(@"{""Tag"":""Box"",""Width"":10,""Height"":20}", json1);
            Assert.Equal(@"{""Tag"":""Circle"",""Radius"":30}", json2);

            Shape restored1 = JsonSerializer.Deserialize <Shape>(json1, options);
            Shape restored2 = JsonSerializer.Deserialize <Shape>(json2, options);

            Assert.NotNull(restored1);
            Box restoredBox = Assert.IsType <Box>(restored1);

            Assert.Equal(10, restoredBox.Width);
            Assert.Equal(20, restoredBox.Height);

            Assert.NotNull(restored2);
            Circle restoredCircle = Assert.IsType <Circle>(restored2);

            Assert.Equal(30, restoredCircle.Radius);
        }
예제 #20
0
        public void WriteWithCustomDiscriminator()
        {
            JsonSerializerOptions options = new JsonSerializerOptions();

            options.SetupExtensions();
            DiscriminatorConventionRegistry registry = options.GetDiscriminatorConventionRegistry();

            registry.RegisterConvention(new CustomDiscriminatorConvention());
            registry.RegisterType(typeof(NameObject2));

            BaseObjectHolder2 obj = new BaseObjectHolder2
            {
                BaseObject = new NameObject2
                {
                    Id   = 1,
                    Name = "foo"
                },
            };

            string       actual   = JsonSerializer.Serialize(obj, options);
            const string expected = @"{""BaseObject"":{""type"":263970807,""Name"":""foo"",""Id"":1},""NameObject"":null}";

            Assert.Equal(expected, actual);
        }
 public DiscriminatorMapping(DiscriminatorConventionRegistry discriminatorConventionRegistry,
                             IObjectMapping objectMapping)
 {
     _discriminatorConventionRegistry = discriminatorConventionRegistry;
     _objectMapping = objectMapping;
 }