我正在构建一个.NET WebApi项目.我的一个ApiControllers返回一个数据表.在JSON格式中,它看起来都很好,但XML格式包含了我不需要的垃圾.
所以,我在想,让我们编写自己的XML序列化.为此,我创建了一个实现IXmlSerializable的新类.它看起来像这样:
public class MyDataTable : IXmlSerializable { public MyDataTable(DataTable datatable) { this.Data = datatable; } public void WriteXml(XmlWriter writer) { writer.WriteStartElement("Test"); writer.WriteElementString("T","hello world"); writer.WriteEndElement(); } public XmlSchema GetSchema() { return null; } public void ReadXml(XmlReader reader) { throw new NotImplementedException(); } public DataTable Data { get; set; } }
现在我的XML看起来很棒,但我的JSON不是.
JSON看起来像:
{"Data":[{"id":1,"name":"John"},{"id":2,"name":"Julia"}]}
我真正想要的是:
[{"id":1,"name":"Julia"}]
我已经编写了自己的数据表序列化来实现我的目标.
感兴趣的人:
[JsonConverter(typeof(DataTableConverter))] [XmlRoot("Result")] public class MyDataTable : IXmlSerializable { public MyDataTable(DataTable datatable) { this.Data = datatable; } public void WriteXml(XmlWriter writer) { foreach (DataRow row in Data.Rows) { writer.WriteStartElement(Data.TableName); foreach (DataColumn column in row.Table.Columns) { writer.WriteElementString(column.ColumnName,row[column].ToString()); } writer.WriteEndElement(); } } public XmlSchema GetSchema() { return null; } public void ReadXml(XmlReader reader) { throw new NotImplementedException(); } public DataTable Data { get; set; } }
和自定义JSON转换器:
public class DataTableConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(MyDataTable).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer) { MyDataTable myDataTable = value as MyDataTable; DataTable dt = myDataTable.Data; writer.WriteStartArray(); foreach (DataRow row in dt.Rows) { writer.WriteStartObject(); foreach (DataColumn column in row.Table.Columns) { writer.WritePropertyName(column.ColumnName); serializer.Serialize(writer,row[column]); } writer.WriteEndObject(); } writer.WriteEndArray(); } }
像这样实现新的DataTable类:
public class ValuesController : ApiController { // GET api/values public MyDataTable Get() { DataTable dt = new DataTable(); dt.TableName = "info"; using (sqlConnection cn = new sqlConnection("Data Source=(local);Initial Catalog=ApiPoc;Integrated Security=true;")) { cn.Open(); using (sqlCommand cm = new sqlCommand("select * from employee",cn)) { sqlDataReader dr = cm.ExecuteReader(); dt.Load(dr); } } MyDataTable md = new MyDataTable(dt); return md; } }