C# 序列化与非序列化

2023.1.5

 

JavaScriptSerializer

参考实体类:Customer

public class Customer
{
   public int Unid { get; set; }
   public string CustomerName { get; set; }
}

(一)反序列化,用于将对象转换为 JSON 字符串

public string ScriptSerialize(Customer customer)
{
  JavaScriptSerializer js = new JavaScriptSerializer();
  return js.Serialize(customer);
}
Customer cc = new Customer { Unid = 1, CustomerName = "John" };
string strJson = ScriptSerialize(cc);
Console.WriteLine(strJson);

(二)反序列化,将JSON 字符串转换为对象

public Customer ScriptDeserialize(string strJson)
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    return js.Deserialize<Customer>(strJson);
}
Customer c1 = ScriptDeserialize(strJson);
Console.WriteLine(c1.Unid + " " + c1.CustomerName);

(三)方法泛型

复制代码
public string ScriptSerialize<T>(T t)
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    return js.Serialize(t);
}

public T ScriptDeserialize<T>(string strJson)
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    return js.Deserialize<T>(strJson);
}
复制代码
Customer cc = new Customer { Unid = 1, CustomerName = "John" };
string strJson = ScriptSerialize<Customer>(cc);
Console.WriteLine(strJson);
Customer c1 = ScriptDeserialize<Customer>(strJson);
Console.WriteLine(c1.Unid + " " + c1.CustomerName);

JsonConvert

复制代码
public class Person
    {
        /// <summary>
        /// 名称
        /// </summary>
        public string pName;

        /// <summary>
        /// 年龄
        /// </summary>
        public int pAge;

        /// <summary>
        /// 性别
        /// </summary>
        public string pSex;
    }
复制代码
复制代码
  // 声明一个Person对象,并赋值
            Person p1 = new Person();
            p1.pName = "张三";
            p1.pAge = 18;
            p1.pSex = "";

            // 输出类型
            Console.WriteLine("输出p1类型:{0}" + "\n",p1.GetType());

            //  转换成JSON字符串
            var str = JsonConvert.SerializeObject(p1);
            Console.WriteLine("输出转换后的值:{0}" + "\n" + "转换后的类型:{1} " + "\n", str,str.GetType());

            // 使用反序列化到指定Person类型
            var pStr = JsonConvert.DeserializeObject<Person>(str);
            Console.WriteLine("接受后的Name:{0}" + "\n" + "反序列后的类型:{1} " + "\n", pStr.pName, pStr.GetType());

            Console.ReadKey();
复制代码

 将字典类型序列化为json字符串

 

复制代码
/// <summary>
/// 将字典类型序列化为json字符串
/// </summary>
/// <typeparam name="TKey">字典key</typeparam>
/// <typeparam name="TValue">字典value</typeparam>
/// <param name="dict">要序列化的字典数据</param>
/// <returns>json字符串</returns>
public static class JsonUntity
    {

        public static string SerializeDictionaryToJsonString<TKey, TValue>(Dictionary<TKey, TValue> dict)
        {
            if (dict.Count == 0)
                return "";

            string jsonStr = JsonConvert.SerializeObject(dict);
            return jsonStr;
        }

        /// <summary>
        /// 将json字符串反序列化为字典类型
        /// </summary>
        /// <typeparam name="TKey">字典key</typeparam>
        /// <typeparam name="TValue">字典value</typeparam>
        /// <param name="jsonStr">json字符串</param>
        /// <returns>字典数据</returns>
        public static Dictionary<TKey, TValue> DeserializeStringToDictionary<TKey, TValue>(string jsonStr)
        {
            if (string.IsNullOrEmpty(jsonStr))
                return new Dictionary<TKey, TValue>();

            Dictionary<TKey, TValue> jsonDict = JsonConvert.DeserializeObject<Dictionary<TKey, TValue>>(jsonStr);

            return jsonDict;

        }
    }
复制代码

 

JSON序列化

 

复制代码
   /// <summary>
    /// JSON序列化
    /// </summary>
    public string JsonSerializer<T>(T t)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, t);
        string jsonString = Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
        return jsonString;
    }
复制代码

 

Json数据反序列化为Dictionary并根据关键字获取指定的值

Json数据:

复制代码
{
  "dataSet": {
    "header": {
      "returnCode": "0", 
      "errorInfo": "HTTP请求错误", 
      "version": "V1.0R010", 
      "totalRows": "2000", 
      "returnRows": "20"
    }, 
    "fieldDefine": {
      "assetId": "string", 
      "serverIdcId": "int", 
      "inputTime": "datetime"
    }, 
    "data": {
      "row": [
        {
          "AssetId": "TCNS2006888", 
          "ServerIdcId": "1", 
          "InputTime": "2008-12-12"
        }, 
        {
          "AssetId": "TCNS2006889", 
          "ServerIdcId": "2", 
          "InputTime": "2008-1-1"
        }
      ]
    }
  }
}
复制代码

将json数据转成dictionary:

复制代码
/// <summary>
/// 将json数据反序列化为Dictionary
/// </summary>
/// <param name="jsonData">json数据</param>
/// <returns></returns>
private Dictionary<string, object> JsonToDictionary(string jsonData)
{
    //实例化JavaScriptSerializer类的新实例
    JavaScriptSerializer jss = new JavaScriptSerializer();
    try
    {
        //将指定的 JSON 字符串转换为 Dictionary<string, object> 类型的对象
        return jss.Deserialize<Dictionary<string, object>>(jsonData);
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}
复制代码

使用方法:

复制代码
private void button1_Click(object sender, EventArgs e)
{
    //Json数据
    string json = "{\"dataSet\":{\"header\":{\"returnCode\":\"0\",\"errorInfo\":\"HTTP请求错误\",\"version\":\"V1.0R010\",\"totalRows\":\"2000\",\"returnRows\":\"20\"},\"fieldDefine\":{\"assetId\":\"string\",\"serverIdcId\":\"int\",\"inputTime\":\"datetime\"},\"data\":{\"row\":[{\"AssetId\":\"TCNS2006888\",\"ServerIdcId\":\"1\",\"InputTime\":\"2008-12-12\"},{\"AssetId\":\"TCNS2006889\",\"ServerIdcId\":\"2\",\"InputTime\":\"2008-1-1\"}]}}}";
    Dictionary<string, object> dic = JsonToDictionary(json);//将Json数据转成dictionary格式
    Dictionary<string, object> dataSet=(Dictionary<string, object>)dic["dataSet"];
    //使用KeyValuePair遍历数据
    foreach (KeyValuePair<string, object> item in dataSet)
    {
        if (item.Key.ToString() == "header")//获取header数据
        {
            var subItem=(Dictionary<string,object>)item.Value;
            foreach (var str in subItem)
            {
                textBox1.AppendText(str.Key + ":" + str.Value+"\r\n");//显示到界面
            }
            break;
        }
    }
}
复制代码

 

 

--

 

posted @   船长华莱士  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示