在C#中使用Json.Net進行序列化和反序列化及定製化

  序列化(Serialize)是將對象轉換成字節流,並將其用於存儲或傳輸的過程,主要用途是保存對象的狀態,以便在須要時從新建立該對象;反序列化(Deserialize)則是將上面的字節流轉換爲相應對象的過程;在.Net陣營中,Json.Net是由官方推薦的高性能開源序列化/反序列化工具,其官方網站:https://www.newtonsoft.com/jsonjson

  1、將對象序列化爲Json格式字符串ide

  首先是正常的序列化操做,對於給定的類:工具

private class MyClass
{
    public int MyNum;
    public string MyStr;
}

  將該類的實例序列化爲Json格式字符串,首先引用命名空間Newtonsoft.Json:性能

MyClass myClass = new MyClass { MyNum = 10, MyStr = "Hello World" };
Console.WriteLine(JsonConvert.SerializeObject(myClass));

  其打印結果:網站

{"MyNum":10,"MyStr":"Hello World"}

  在打印到本地Log文件以供本身查看使用時,能夠選擇轉換爲帶有縮進的Json格式字符串:spa

Console.WriteLine(JsonConvert.SerializeObject(myClass, Formatting.Indented));

  此時打印結果爲:code

{
  "MyNum": 10,
  "MyStr": "Hello World"
}

  2、將Json格式字符串反序列化爲對象orm

  對於給定的字符串:對象

string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";

  將其反序列化爲MyClass類型的對象:blog

MyClass myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
Console.WriteLine(myClass.MyStr); //Hello World

  3、使用JObject動態序列化/反序列化

  以上例子都是使用強類型進行序列化和反序列操做,但有時也會用到不指定類型而直接操做Json格式數據的狀況,此時就須要用位於命名空間ewtonsoft.Json.Linq中的JObject類型的對象:

string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";
JObject jObject = JObject.Parse(jsonStr);
Console.WriteLine(jObject.ToString(Formatting.None));  //{"MyNum":10,"MyStr":"Hello World"}
//打印一條屬性的值
Console.WriteLine(jObject["MyStr"].Value<string>());  //Hello World
//添加一條屬性
jObject.Add("MyStr2", "HaHa");
//打印當前Json字符串
Console.WriteLine(jObject.ToString(Formatting.None)); //{"MyNum":10,"MyStr":"Hello World","MyStr2":"HaHa"}

  4、定製化序列化/反序列過程

  1.在C#中,定製化的配置一般使用特性來完成,這裏也不例外,例如簡單的,在序列化/反序列時忽略某個字段/屬性:

private class MyClass
{
    [JsonIgnore]
    public int MyNum;
    public string MyStr;
}

  此時,不管序列化仍是反序化時,字段MyNum都再也不參與這些過程;

  2.自定義某個字段/屬性的序列化/反序列化規則:

  當接收到的Json格式字符串與本地已有類型不統一時,須要進行自定義的反序列化過程,反之亦然,例如Json字符串中以字符串"TRUE"表示布爾類型true(不自定義,這個過程依然走的通,只是以此舉例),以字符串"FALSE"表示布爾類型false時,須要自定義以下:

/// <summary>
/// 自定義布爾類型數據轉換規則
/// </summary>
public class MyBoolConverter : JsonConverter
{
    private const string TrueStr = "TRUE";
    private const string FalseStr = "FALSE";
    public override bool CanConvert(Type objectType) => true;

    //反序列化
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.ValueType == typeof(string))
        {
            if ((string)reader.Value == TrueStr)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        return false;
    }

    //序列化
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value.GetType() == typeof(bool))
        {
            bool result = (bool)value;
            if (result)
            {
                writer.WriteValue(TrueStr);
            }
            else
            {
                writer.WriteValue(FalseStr);
            }
        }
    }
}

  而後,在須要操做的類型定義中的字段/屬性中加入該特性:

private class MyClass
{
    [JsonConverter(typeof(MyBoolConverter))]
    public bool MyBool;
}

  此時:

string jsonStr = @"{""MyBool"": ""TRUE""}";
MyClass1 myClass = JsonConvert.DeserializeObject<MyClass1>(jsonStr);
Console.WriteLine(myClass.MyBool);  //True
Console.WriteLine(JsonConvert.SerializeObject(myClass));  //{"MyBool":"TRUE"}

 


若是您以爲閱讀本文對您有幫助,請點一下「推薦」按鈕,您的承認是我寫做的最大動力!

做者:Minotauros
出處:https://www.cnblogs.com/minotauros/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索