是否有可能使JavaScriptSerializer在没有setter的情况下也填充属性?

时间:2017-10-17 18:22:31

标签: c# javascriptserializer

是否可以让JavaScriptSerializer在没有setter的情况下填充属性?例如,下面代码中的test.ID属性。

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace JavaScriptConverterTest
{
    class Program
    {
        static void Main(string[] args)
        {
            List<test> list = new List<test>();
            for (int i = 0; i < 2; i++)
            {
                list.Add(new test(Guid.NewGuid(), "Item #" + i));
            }
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            string jsonString = serializer.Serialize(list);
            List<test> newList = serializer.Deserialize<List<test>>(jsonString);
            Console.Read();
        }
    }

    class test
    {
        private Guid id = Guid.Empty;

        public Guid ID
        {
            get { return id; }
            // Without a setter, JavaScriptSerializer doesn't populate this property.
            // set { id = value; }
        }
        public string name = "";

        public test()
        {
        }

        public test(Guid id, string name)
        {
            this.id = id;
            this.name = name;
        }
    }
}

[ignore] StackOverflow需要更多细节。

1 个答案:

答案 0 :(得分:0)

您可以使用.NET Framework中内置的 DataContractJsonSerializer ,其主页位于 System.Runtime.Serialization.Json 。您只需要使用 DataMemberAttribute 装饰您的字段。我们假设你有这门课程:

class Foo
{
    private string _boo;

    public Foo(string boo) => _boo = boo;

    public string Boo => _boo;
}

装饰后:

[DataContract]
    class Foo
    {
        [DataMember] private string _boo;

        public Foo(string boo) => _boo = boo;

        public string Boo => _boo;
    }

并测试:

private static void Main(string[] args)
        {
            var foo = new Foo("boo");
            var serializer = new DataContractJsonSerializer(typeof(Foo));
            string str;
            using (var stream = new MemoryStream())
            {
                serializer.WriteObject(stream, foo);
                str = Encoding.Default.GetString(stream.ToArray());
            }

            Console.WriteLine(str);
            Foo loadedFoo;
            using (var stream = new MemoryStream(Encoding.Default.GetBytes(str)))
            {
                loadedFoo = serializer.ReadObject(stream) as Foo;
            }
            Console.WriteLine(loadedFoo.Boo);
            Console.ReadLine();
        }

从json字符串构造的 loadedFoo 得到&#34; boo&#34;作为 _boo 字段的值。