C#中XML、JSON、类T数据格式之间的转换

在C#中,XML与JSON之间可以相互转化

XML与T类型也可以相互转化【XML有且只有一个根节点】

JSON与T类型也可以相互转化。

新建控制台应用程序JsonToXmlToClassDemo,(.net 4.5),

添加对System.Web.Extensions程序集的引用,以及添加Newtonsoft.Json.dll开源类库的引用。

一、XML与实例化类之间的转化

类XmlSerializeUtil的源程序如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;

namespace JsonToXmlToClassDemo
{
    /// <summary>
    /// XML与实例化类之间的转化
    /// </summary>
    public sealed class XmlSerializeUtil
    {
        /// <summary>
        /// 类的对象转换为xml字符串,
        /// 生成的xml的根节点就是T的类型名称
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string ObjectToXml<T>(T t, Encoding encoding)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream())
            {
                using (XmlTextWriter xmlWriter = new XmlTextWriter(ms, encoding))
                {
                    xmlSerializer.Serialize(xmlWriter, t);
                    return encoding.GetString(ms.ToArray()).Trim();
                }
            }
        }
        /// <summary>
        /// xml字符串转实体类,xml字符串的根节点一定要与类名一致,否则将产生错误
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xmlString"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static T XmlToObject<T>(string xmlString, Encoding encoding)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream(encoding.GetBytes(xmlString)))
            {
                return (T)xmlSerializer.Deserialize(ms);
            }
        }
    }
}

二、Json与类T对象之间的相互转化。

可以使用类System.Web.Script.Serialization.JavaScriptSerializer 或者Newtonsoft.Json.JsonConvert

类JsonSerializeUtil源程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using Newtonsoft.Json;

namespace JsonToXmlToClassDemo
{
    /// <summary>
    /// Json与类T对象之间的相互转化
    /// </summary>
    public sealed class JsonSerializeUtil
    {
        /// <summary>
        /// 将一个T对象转化为json字符串
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public static string ObjectToJson<T>(T t)
        {
            //需要添加System.Web.Extensions程序集的引用
            JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
            return javaScriptSerializer.Serialize(t);
        }

        /// <summary>
        /// 将Json字符串反序列化为一个T对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonString"></param>
        /// <returns></returns>
        public static T JsonToObject<T>(string jsonString)
        {
            JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
            return javaScriptSerializer.Deserialize<T>(jsonString);
        }

        /// <summary>
        /// 将一个T对象转化为json字符串,使用Newtonsoft.Json
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public static string ObjectToJsonExtension<T>(T t)
        {
            //需要添加Newtonsoft.Json.dll类库的引用
            return JsonConvert.SerializeObject(t, Formatting.Indented);
        }

        /// <summary>
        /// 将Json字符串反序列化为一个T对象,使用Newtonsoft.Json
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="jsonString"></param>
        /// <returns></returns>
        public static T JsonToObjectExtension<T>(string jsonString)
        {
            return JsonConvert.DeserializeObject<T>(jsonString);
        }
    }
}

三、Json与Xml之间的相互转化

类JsonAndXmlConverterUtil的源程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Xml;

namespace JsonToXmlToClassDemo
{
    /// <summary>
    /// Json与Xml之间的相互转化
    /// </summary>
    public sealed class JsonAndXmlConverterUtil
    {
        /// <summary>
        /// 将某一个xml节点转化为json字符串
        /// XmlDocument也是一种XmlNode
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        public static string XmlToJson(XmlNode node)
        {
            return JsonConvert.SerializeXmlNode(node, Newtonsoft.Json.Formatting.Indented);
        }

        /// <summary>
        /// Json字符串转xml文档
        /// </summary>
        /// <param name="jsonString"></param>
        /// <returns></returns>
        public static XmlDocument JsonToXml(string jsonString)
        {
            //如果没有配置根节点名称,可能会转换异常
            return JsonConvert.DeserializeXmlNode(jsonString, "Root");
        }
    }
}

四、测试源程序Program如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace JsonToXmlToClassDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetWindowSize(150, 40);
            Employee employee = new Employee()
            {
                CoreId = 66,
                EmployeeName = "北洛",
                EmployeeAddress = "天鹿城",
                BirthWeek = DayOfWeek.Friday
            };
            try
            {
                string result = XmlSerializeUtil.ObjectToXml(employee, Encoding.UTF8);
                Console.WriteLine(result);
                Console.WriteLine();
                result = JsonSerializeUtil.ObjectToJson(employee);
                Console.WriteLine(result);
                Console.WriteLine();
                result = JsonSerializeUtil.ObjectToJsonExtension(employee);
                Console.WriteLine(result);
                Console.WriteLine();
                XmlDocument xmlDoc = JsonAndXmlConverterUtil.JsonToXml(result);
                Console.WriteLine(xmlDoc.InnerXml);
                Console.WriteLine();
                result = JsonAndXmlConverterUtil.XmlToJson(xmlDoc);
                Console.WriteLine(result);
                Console.WriteLine();
                Console.WriteLine("json字符串转化为对应的类时,如果不匹配类的格式,转化的类不为空,但类的每一个属性值都是默认值 0,false或者空值");
                Employee emp = JsonSerializeUtil.JsonToObject<Employee>(result);
                Console.WriteLine(emp);
                Console.WriteLine();

                string xmlString = "<Employee><CoreId>4</CoreId><EmployeeName>云无月</EmployeeName></Employee>";
                Employee employeeTest = XmlSerializeUtil.XmlToObject<Employee>(xmlString, Encoding.UTF8);
                Console.WriteLine(employeeTest);
                Console.WriteLine();
                Console.WriteLine("xml字符串转换为对应的类时,根节点的名称一定是类的名称,区分大小写。否则将转换异常");
                xmlString = "<EmployeeXX><CoreId>4</CoreId><EmployeeName>云无月</EmployeeName></EmployeeXX>";
                employeeTest = XmlSerializeUtil.XmlToObject<Employee>(xmlString, Encoding.UTF8);
                Console.WriteLine(employeeTest);
                Console.WriteLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 员工类
    /// </summary>
    public class Employee
    {
        /// <summary>
        /// 编号
        /// </summary>
        public int CoreId { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string EmployeeName { get; set; }
        /// <summary>
        /// 地址
        /// </summary>
        public string EmployeeAddress { get; set; }
        /// <summary>
        /// 生日是星期几
        /// </summary>
        [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
        public DayOfWeek BirthWeek { get; set; }

        /// <summary>
        /// 直接打印该类的对象信息
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return $"{
   
   {\"CoreId\":{CoreId},\"EmployeeName\":\"{EmployeeName}\",\"EmployeeAddress\":\"{EmployeeAddress}\",\"BirthWeek\":\"{BirthWeek}\"}}";
        }
    }
}

五、测试运行如图:

おすすめ

転載: blog.csdn.net/ylq1045/article/details/117965660