在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}\"}}";
}
}
}