JSON使用JsonConstructorAttribute,JsonConverterAttribute,JsonObjectAttribute

来源:互联网 发布:vmware6.5.1安装ubuntu 编辑:程序博客网 时间:2024/05/03 12:28
一、JSON使用JsonConstructorAttribute 在反序列化时创建对象(针对构造函数)

1.创建一个User对象.并添加JsonConstructor.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using GongHuiNewtonsoft.Json;namespace JSONDemo{    public class User    {        public string UserName { get; private set; }        public bool Enabled { get; private set; }        public User()        { }        [JsonConstructor]        public User(string userName, bool enabled)        {            this.UserName = userName;            this.Enabled = enabled;        }    }}


2.反序列化时创建User对象.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using GongHuiNewtonsoft.Json;using GongHuiNewtonsoft.Json.Serialization;using GongHuiNewtonsoft.Json.Converters;namespace JSONDemo{    class Program    {        static void Main(string[] args)        {            string json = @"{                ""UserName"":""JSONDemo\\username"",                ""Enabled"":true            }";            User user = JsonConvert.DeserializeObject<User>(json);            Console.WriteLine(user.UserName);            Console.WriteLine(user.Enabled);        }    }}


3.运行的结果

 

二、JSON使用JsonConverterAttribute序列化对象中指定的成员(针对成员)

1.先创建一个UserConverter对象,继承JsonConverter,然后重写WriteJson与ReadJson方法,仅对User中成员UserName实现序列化

using System;using System.Collections.Generic;using System.Linq;using System.Text;using GongHuiNewtonsoft.Json;namespace JSONDemo{    public class UserConverter:JsonConverter    {        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)        {            User user = (User)value;            writer.WriteValue(user.UserName);        }        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)        {            User user = new User();            user.UserName = (string)reader.Value;            return user;        }        public override bool CanConvert(Type objectType)        {            return objectType == typeof(User);        }    }}


2.创建一个User对象,并使用JsonConverter

using System;using System.Collections.Generic;using System.Linq;using System.Text;using GongHuiNewtonsoft.Json;namespace JSONDemo{    [JsonConverter(typeof(UserConverter))]    public class User    {        public string UserName { get; set; }        public bool Enabled { get; set; }    }}


3.序列化User对象

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using GongHuiNewtonsoft.Json;using GongHuiNewtonsoft.Json.Serialization;using GongHuiNewtonsoft.Json.Converters;namespace JSONDemo{    class Program    {        static void Main(string[] args)        {            User user = new User            {                UserName = @"JSONDemo\username",                Enabled=true            };            string json = JsonConvert.SerializeObject(user, Formatting.Indented);            Console.WriteLine(json);                   }    }}


4.运行结果,注意:Enabled设置了值,但是没有序列化

 

三、JSON使用JsonConverterAttribute序列化与反序列化(针对成员<引用类型>)

 1.先创建一个枚举

using System;namespace JSONDemo{    public enum UserStatus    {        NotConfirmed,        Active,        Deleted    }}


2.再创建一个对象User,给其对象添加引用枚举的成员,并在其上指定JsonConverter类型,即UserStatus

using System;using System.Collections.Generic;using System.Linq;using System.Text;using GongHuiNewtonsoft.Json;using GongHuiNewtonsoft.Json.Converters;namespace JSONDemo{        public class User    {        public string UserName { get; set; }        [JsonConverter(typeof(StringEnumConverter))]        public UserStatus Status { get; set; }    }}


3.序列化与反序列化

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using GongHuiNewtonsoft.Json;using GongHuiNewtonsoft.Json.Serialization;using GongHuiNewtonsoft.Json.Converters;namespace JSONDemo{    class Program    {        static void Main(string[] args)        {            User user = new User            {                UserName = @"JSONDemo\username",                Status = UserStatus.Active            };            string json = JsonConvert.SerializeObject(user, Formatting.Indented);            Console.WriteLine(json);            User user1 = JsonConvert.DeserializeObject<User>(json);            Console.WriteLine(user1.UserName);            Console.WriteLine(user1.Status);        }    }}


4.运行的结果

四、JSON使用JsonObjectAttribute仅序列化指定JsonPropertyAttribute的属性

1.先创建一个File对象,然后添加JsonObject并指示仅属性序列化.即属性标记为System.Runtime.Serialization.DataMemberAttribute或者JsonProperty.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using GongHuiNewtonsoft.Json;namespace JSONDemo{    [JsonObject(MemberSerialization.OptIn)]    public class File    {        public Guid Id { get; set; }        [JsonProperty]        public string Name { get; set; }        [JsonProperty]        public int Size { get; set; }    }}


2.实例化File对象,然后序列化.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using GongHuiNewtonsoft.Json;using GongHuiNewtonsoft.Json.Serialization;using GongHuiNewtonsoft.Json.Converters;namespace JSONDemo{    class Program    {        static void Main(string[] args)        {            File file = new File            {                Id = Guid.NewGuid(),                Name = "JSONDemo.JsonObjectAttribute.OptIn",                Size = 1024            };            string json = JsonConvert.SerializeObject(file, Formatting.Indented);            Console.WriteLine(json);        }    }}


3.运行结果,注意:属性Id未被序列化.

 

五、JSON使用JsonObjectAttribute序列化类实现IEnumerable<T>作为JSON对象而不是JSON数组

1.创建一个Directory对象,继承IEnumerable<string>.添加一个构造函数,在其中实例化数组.然后实现GetEnumerator方法.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;using GongHuiNewtonsoft.Json;namespace JSONDemo{    [JsonObject]    public class Directory:IEnumerable<string>    {        public string Name { get; set; }        public IList<string> Files { get; set; }        public Directory()        {            Files = new List<string>();        }        public IEnumerator<string> GetEnumerator()        {            return Files.GetEnumerator();        }        IEnumerator IEnumerable.GetEnumerator()        {            return GetEnumerator();        }    }}


2.实例化Directory对象,然后给属性Files添加项,再序列化.注意:这里序列化是的IEnumerator<string>对象,而非数组.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using GongHuiNewtonsoft.Json;using GongHuiNewtonsoft.Json.Serialization;using GongHuiNewtonsoft.Json.Converters;namespace JSONDemo{    class Program    {        static void Main(string[] args)        {                        Directory dir = new Directory            {                Name = "GongHui's documents",                Files =                {                    "JSONDemo.JsonObjectAttribute",                    "JSONDemo.JsonObjectAttribute.IEnumerable<T>"                }            };            string json = JsonConvert.SerializeObject(dir, Formatting.Indented);            Console.WriteLine(json);        }    }}


3.运行的结果

 

JSON源代码下载地址:http://download.csdn.net/detail/lovegonghui/9342751

 

1 0
原创粉丝点击