序列化(serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(deserialize)则是将上面的字节流转换为相应对象的过程;在.net阵营中,json.net是由官方推荐的高性能开源序列化/反序列化工具,其官方网站:;

  一、将对象序列化为json格式字符串

  首先是正常的序列化操作,对于给定的类:

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格式字符串:

console.writeline(jsonconvert.serializeobject(myclass, formatting.indented));

  此时打印结果为:

{
  "mynum": 10,
  "mystr": "hello world"
}

  二、将json格式字符串反序列化为对象

  对于给定的字符串:

string jsonstr = @"{""mynum"": 10,""mystr"": ""hello world""}";

  将其反序列化为myclass类型的对象:

myclass myclass = jsonconvert.deserializeobject<myclass>(jsonstr);
console.writeline(myclass.mystr); //hello world

  三、使用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"}

  四、定制化序列化/反序列过程

  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
出处:

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。