Json.NET使用汇总

首先去下载最新的Newtonsoft.Json.dll

http://json.codeplex.com/

https://github.com/JamesNK/Newtonsoft.Json

https://github.com/JamesNK/Newtonsoft.Json/releases 

Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换。

Json.NET基础用法

  序列化、反序列化实体类(将实体类对象序列化为Json字符串)

    /// <summary>
    /// 实体类
    /// </summary>
    public class Pat_Info
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string CardNo { get; set; }
    }
//序列化
private void button1_Click(object sender, EventArgs e)
{
    List<Pat_Info> pat_list = new List<Pat_Info>();
    //实例类赋值
    for (int i = 0; i < 10; i++)
    {
        Pat_Info pat1 = new Pat_Info
        {
            Name = "赵赵"+i,
            Age = 25+i,
            CardNo = "0000000"+i
        };
        pat_list.Add(pat1);
    }
    //序列化
    string jsonStr = JsonConvert.SerializeObject(pat_list, Formatting.Indented);
    textBox1.Text = jsonStr;

  }

//反序列化
private void button2_Click(object sender, EventArgs e)
{
    //Json字符串
    List<Pat_Info> pat_list = new List<Pat_Info>();
    string jsonStr = textBox1.Text;
    //反序列化
    pat_list = JsonConvert.DeserializeObject<List<Pat_Info>>(jsonStr);
    for (int i = 0; i < pat_list.Count; i++)
    {
        textBox1.Text += "\r\n"+ pat_list[i].Age.ToString() + "|" + pat_list[i].Name + "|" + pat_list[i].CardNo+"\r\n";
    }
}

序列化与反序列化时属性使用

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/// <summary>
/// zhao.fw 
/// </summary>
namespace Json.NET
{
    /// <summary>
    /// 实体类
    /// </summary>
    public class Pat_Info
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string CardNo { get; set; }
    }

    /* 序列化与反序列化时忽略某些属性
     * 1、忽略类内所有属性
     * [JsonObject(MemberSerialization.OptIn)]用于在序列化与反序列化时忽略一个类里所有的属性,
     * 只有当在类内属性上打特性标签[JsonProperty]时才支持序列化与反序列化。
     * 所以[JsonObject(MemberSerialization.OptIn)]常用于与[JsonProperty]配合使用。
     */

    [JsonObject(MemberSerialization.OptIn)]
    public class Pat_Info_01
    {
        public string Name { get; set; }
        [JsonProperty]
        public int Age { get; set; }
        public string CardNo { get; set; }
    }

    /*2、序列化所有属性(默认)
     *   默认实体类上默认打着[JsonObject(MemberSerialization.OptOut)]特性标签(可以省略不写),
     *   如果要忽略某些属性,要在属性上打[JsonIgnore]。
     */
    [JsonObject(MemberSerialization.OptOut)]
    public class Pat_Info_02
    {
        public string Name { get; set; }
        [JsonIgnore]
        public int Age { get; set; }
        public string CardNo { get; set; }
    }

    /*
     * 默认值处理
     * 设置属性默认值
   * 在属性上打 [DefaultValue("xxx")]
     */
    public class Pat_Info_03
    {
        public string Name { get; set; }
        [System.ComponentModel.DefaultValue("20")]
        public int Age { get; set; }
        public string CardNo { get; set; }
    }

    /*空值处理
     */
    public class Pat_Info_04
    {
        //不序列化为null的属性
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string Name { get; set; }
        public int Age { get; set; }
        public string CardNo { get; set; }
    }
    /* 序列化私有成员
     * 因为默认只序列化public的成员,所以如果想序列化private成员,要在实体类的属性上打[JsonProperty]标签。
     */
    public class Pat_Info_05
    {
        public string Name { get; set; }
        [JsonProperty]
        private int Age { get; set; }
        public string CardNo { get; set; }
    }
    /*自定义序列化名称
     *  在序列化与反序列化时可以自定义序列化出字符串的属性名称,
     *  如下代码可以将实体类的Name属性序列化为PatName属性,并且可以将Json中的PatName反序列化为当前实体类的Name属性。(双向)
     */
    public class Pat_Info_06
    {
        [JsonProperty(PropertyName = "PatName")]
        public string Name { get; set; }
        public int Age { get; set; }
        public string CardNo { get; set; }
    }
    /*日期处理
     * 解决方案1:在可以动Model代码的情况下
   * 系统自带的DateTime会格式化成iso日期标准,
     * 但是实际使用过程中大多数使用的可能是yyyy-MM-dd 或者yyyy-MM-dd HH:mm:ss两种格式的日期,
     * 解决办法是可以将DateTime类型改成string类型自己格式化好,然后在序列化。
     * 
     * 代码思路是不去序列化StartTime属性,而去序列化string类型的m_StartTime属性(m_StartTime相当于StartTime属性的私有字段)。
     */
    public class Pat_Info_07
    {
        [JsonProperty(PropertyName = "PatName")]
        public string Name { get; set; }
        public int Age { get; set; }
        public string CardNo { get; set; }

        [JsonProperty(PropertyName = "StartTime")]//因为默认只序列化public属性,所以要打上JsonProperty标签并且声明名称
        private string m_StartTime { get; set; }

        [JsonIgnore]//这个标签用于在序列化与反序列化时忽略StartTime属性
        public DateTime StartTime
        {
            get { return Convert.ToDateTime(m_StartTime); }
            set
            {
                DateTime time = value;
                m_StartTime = time.ToString("yyyy-MM-dd");//这里写自己想要的格式
            }
        }
    }
    /* 日期处理
     * 解决方案2:使用DateTimeConverterBase
   * Json.Net提供了IsoDateTimeConverter日期转换这个类,可以通过JsnConverter实现相应的日期转换
     * 
     */
    public class Pat_Info_08
    {
        [JsonProperty(PropertyName = "PatName")]
        public string Name { get; set; }
        public int Age { get; set; }
        public string CardNo { get; set; }
        //但是IsoDateTimeConverter日期格式(yyyy-MM-ddTHH:mm:ss)不是我们想要的,我们可以继承该类实现自己的日期
        [JsonConverter(typeof(Newtonsoft.Json.Converters.IsoDateTimeConverter))]
        public DateTime Birthday { get; set; }

        [JsonConverter(typeof(ChinaDateTimeConverter))]
        public DateTime Birthday2 { get; set; }
    }
    public class ChinaDateTimeConverter : DateTimeConverterBase
    {
        private static IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" };

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            return dtConverter.ReadJson(reader, objectType, existingValue, serializer);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            dtConverter.WriteJson(writer, value, serializer);
        }
    }

    /**/

    public class Pat_Info_09
    {
        [JsonProperty(PropertyName = "PatName")]
        public string Name { get; set; }
        public int Age { get; set; }
        public string CardNo { get; set; }
    }

}

以驼峰命名法序列化

private void button3_Click(object sender, EventArgs e)
{
    Pat_Info_03 pat1 = new Pat_Info_03
    {
        Name = "赵赵",
        Age = 25,
        CardNo = "00000001"
    };
    JsonSerializerSettings setting = new JsonSerializerSettings();
    //这样子的话,在序列实体类对象pat1的属性时,属性名称将由CardNo转换为cardNo。
    setting.ContractResolver = new CamelCasePropertyNamesContractResolver();
    string jsonStr = JsonConvert.SerializeObject(pat1,Formatting.Indented, setting);
    textBox1.Text = jsonStr;
}

将多个数据类型序列化为1个Json对象(序列化匿名类)

private void button4_Click(object sender, EventArgs e)
{
    /* 将多个数据类型序列化为1个Json对象(序列化匿名类)
     * 有时我们有这样的需求,对方要求我们传输过去的Json字符串要包含我们多个实体类型的信息,笨方法就是重新构建一个符合要求的实体类型,
     * 但是我们又更好的方法,我们可以使用匿名类,把Json需要的信息均放在匿名类中,我们可以对匿名类进行序列化。
     */
    List<Pat_Info> list1 = new List<Pat_Info>();
    //实例类赋值
    for (int i = 0; i < 5; i++)
    {
        Pat_Info pat1 = new Pat_Info
        {
            Name = "赵赵" + i,
            Age = 25 + i,
            CardNo = "0000000" + i
        };
        list1.Add(pat1);
    }
    List<Pat_Info_09> list2 = new List<Pat_Info_09>();
    for (int i = 0; i < 5; i++)
    {
        Pat_Info_09 pat2 = new Pat_Info_09
        {
            Name = "张张" + i,
            Age = 25 + i,
            CardNo = "0000000" + i
        };
        list2.Add(pat2);
    }
    List<string> info = new List<string>() { "赵赵", "北京" };
    var json = new { information = info, jsonList1 = list1, jsonList2 = list2 };
    //开始序列化
    string jsonStr = JsonConvert.SerializeObject(json, Formatting.Indented);
    textBox1.Text = jsonStr;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aries·Zhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值