推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

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

   2023-08-17 网络整理佚名1530
核心提示:首先是正常的序列化操作,对于给定的类:将其反序列化为类型的对象:三、使用动态序列化/反序列化以上例子都是使用强类型进行序列化和反序列操作,但有时也会用到不指定类型而直接操作Json格式数据的情况,此时就需要用位于命名空间.四、定制化序列化/反序列过程在C#中,定制化的配置通常使用特性来完成,这里也不例外,例如简单的,在序列化/反序列时忽略某个字段/属性:

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

1.将对象序列化为Json格式字符

首先是给定类的正常序列化操作

portant;font-size: 12px !important;">private class MyClass
{
public int MyNum;
public string MyStr;
}

要将此类的实例序列化为 Json 格式字符串,请首先引用命名空间 .Json:

portant;font-size: 12px !important;">MyClass myClass = new MyClass { MyNum = 10, MyStr = "Hello World" };
Console.WriteLine(JsonConvert.SerializeObject(myClass));

它打印结果:

portant;font-size: 12px !important;">{"MyNum":10,"MyStr":"Hello World"}

当打印到本地日志文件供您自己查看时,您可以选择转换为带有缩进的 Json 格式字符串:

portant;font-size: 12px !important;">Console.WriteLine(JsonConvert.SerializeObject(myClass, Formatting.Indented));

此时打印的结果是:

portant;font-size: 12px !important;">{
"MyNum": 10,
"MyStr": "Hello World"
}

2、将Json格式字符串反序列化为对象

对于给定的字符串:

portant;font-size: 12px !important;">string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";

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

portant;font-size: 12px !important;">MyClass myClass = JsonConvert.DeserializeObject(jsonStr);
Console.WriteLine(myClass.MyStr); //Hello World

3.使用动态序列化/反序列化

上面的例子都是使用强类型进行序列化和反序列化操作,但有时也用于直接操作Json格式数据而不指定类型。 在这种情况下,有必要使用位于命名空间 .Json.Linq 中的类型的对象:

portant;font-size: 12px !important;">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#中,定制配置通常是使用特性来完成的,这次也不例外。 例如,在序列化/反序列化时简单地忽略某个字段/属性:

portant;font-size: 12px !important;">private class MyClass
{
[JsonIgnore]
public int MyNum;
public string MyStr;
}

此时,无论序列化还是反序列化,字段MyNum不再参与这些过程;

2.自定义字段/属性的序列化/反序列化规则:

当接收到的Json格式字符串与本地已有类型不一致时,需要自定义反序列化过程,反之亦然,例如Json字符串中的字符串“TRUE”代表布尔类型true(没有自定义,这个过程仍然有效,仅作为示例),当使用字符串“FALSE”表示布尔类型 false 时,需要自定义如下:

portant;font-size: 12px !important;">/// 
/// 自定义布尔类型数据转换规则
///

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);
}
}
}
}

然后,将属性添加到类型定义中需要操作的字段/属性中:

portant;font-size: 12px !important;">private class MyClass
{
[JsonConverter(
typeof(MyBoolConverter))]
public bool MyBool;
}

此时:

portant;font-size: 12px !important;">string jsonStr = @"{""MyBool"": ""TRUE""}";
MyClass1 myClass
= JsonConvert.DeserializeObject(jsonStr);
Console.WriteLine(myClass.MyBool); //True
Console.WriteLine(JsonConvert.SerializeObject(myClass)); //{"MyBool":"TRUE"}

如果您觉得阅读本文对您有帮助,请点击“推荐”按钮,您的认可是我写作的最大动力!

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON