C# JSON与XML序列化及反序列化实现方案
在C#开发中,经常需要在对象、JSON字符串和XML之间进行数据转换。本文将通过具体代码展示如何利用JavaScriptSerializer和XmlSerializer实现双向序列化与反序列化,包括将JSON字符串转换为DataTable等实用场景。
核心序列化方法
第1步:对象转为JSON字符串
使用 JavaScriptSerializer 将任意泛型对象序列化为标准的JSON字符串,这是API交互中最常见的格式。
public string ScriptSerialize<T>(T t)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize(t);
}
第2步:对象转为XML字符串
利用 XmlSerializer 配合 MemoryStream 和 XmlTextWriter,可以排除命名空间前缀,输出纯净的XML字符串。
public string ScriptSerializeToXML<T>(T t)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (MemoryStream mem = new MemoryStream())
{
XmlWriter writer = XmlWriter.Create(mem, new XmlWriterSettings { Indent = false });
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", ""); // 移除 xmlns:xsd 和 xmlns:xsi
serializer.Serialize(writer, t, ns);
writer.Close();
return Encoding.UTF8.GetString(mem.ToArray());
}
}
常见反序列化场景
第3步:JSON字符串反序列化为单对象
直接解析JSON字符串还原为对应的泛型实体对象。
public T ScriptDeserialize<T>(string strJson)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Deserialize<T>(strJson);
}
第4步:JSON字符串反序列化为列表
适用于接收前端传来的数组JSON,将其转换为 List<T> 集合。
public List<T> JSONStringToList<T>(string strJson)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<T> objList = serializer.Deserialize<List<T>>(strJson);
return objList;
}
第5步:JSON字符串转换为DataTable
这是一个较为复杂的转换过程。原理是先清理JSON中的数组括号,分割出单个对象JSON,再通过反射获取属性名建立表结构并填充数据行。
public DataTable JSONStringToDataTable<T>(string strJson)
{
DataTable dt = new DataTable();
if (strJson.IndexOf("[") > -1) // 如果是数组格式
{
// 去除首尾方括号并将 },{ 替换为 ; 分隔符
strJson = strJson.Remove(strJson.Length - 1, 1).Remove(0, 1).Replace("},{", "};{");
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
string[] items = strJson.Split(';');
// 通过反射创建列头
foreach (PropertyInfo property in typeof(T).GetProperties())
{
DataColumn col = new DataColumn(property.Name, property.PropertyType);
dt.Columns.Add(col);
}
// 遍历分割后的字符串重新组装行数据
for (int i = 0; i < items.Length; i++)
{
DataRow dr = dt.NewRow();
T temp = serializer.Deserialize<T>(items[i]);
foreach (PropertyInfo property in typeof(T).GetProperties())
{
dr[property.Name] = property.GetValue(temp, null);
}
dt.Rows.Add(dr);
}
return dt;
}
第6步:XML字符串反序列化为对象
解析XML节点并将其映射回实体对象。建议增加异常处理以应对非标准XML格式。
public T XMLToObject<T>(string xmlString)
{
try
{
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(xmlString);
XmlNodeReader reader = new XmlNodeReader(xdoc.DocumentElement);
XmlSerializer ser = new XmlSerializer(typeof(T));
object obj = ser.Deserialize(reader);
return (T)obj;
}
catch
{
return default(T);
}
}
调用实例演示
以下展示如何定义一个简单的登录模型并调用上述通用方法进行数据流转。
- 定义实体:
public class LoginObject
{
public string Account { get; set; }
public string Password { get; set; }
}
- 执行序列化与反序列化流程:
// 1. 准备原始对象
LoginObject loginObject = new LoginObject
{
Account = "user@example.com",
Password = "secret"
};
// 2. 转为 JSON 字符串
string jsonStr = Serialize.ScriptSerialize(loginObject);
// 3. 转为 XML 字符串
string xmlStr = Serialize.ScriptSerializeToXML(loginObject);
// 4. JSON 还原为 Object
LoginObject resultObj = Serialize.ScriptDeserialize<LoginObject>(jsonStr);
// 5. XML 还原为 Object
LoginObject resultXmlObj = Serialize.XMLToObject<LoginObject>(xmlStr);
//注意:实际应用中需注意去掉XML可能携带的首尾空格或标记
以上就是C#中常用JSON和XML序列化与反序列化方法的详细内容,更多关于C#数据处理和接口开发的资料请关注本站其它相关文章!本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













