.NET WebApi DataTable

前端之家收集整理的这篇文章主要介绍了.NET WebApi DataTable前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在构建一个.NET WebApi项目.我的一个ApiControllers返回一个数据表.在JSON格式中,它看起来都很好,但XML格式包含了我不需要的垃圾.

所以,我在想,让我们编写自己的XML序列化.为此,我创建了一个实现IXmlSerializable的新类.它看起来像这样:

  1. public class MyDataTable : IXmlSerializable
  2. {
  3. public MyDataTable(DataTable datatable)
  4. {
  5. this.Data = datatable;
  6. }
  7.  
  8.  
  9. public void WriteXml(XmlWriter writer)
  10. {
  11.  
  12. writer.WriteStartElement("Test");
  13. writer.WriteElementString("T","hello world");
  14. writer.WriteEndElement();
  15. }
  16.  
  17. public XmlSchema GetSchema()
  18. {
  19. return null;
  20. }
  21.  
  22. public void ReadXml(XmlReader reader)
  23. {
  24. throw new NotImplementedException();
  25. }
  26.  
  27. public DataTable Data { get; set; }
  28. }

现在我的XML看起来很棒,但我的JSON不是.
JSON看起来像:

  1. {"Data":[{"id":1,"name":"John"},{"id":2,"name":"Julia"}]}

我真正想要的是:

  1. [{"id":1,"name":"Julia"}]

有没有一种简单的方法可以从JSON结果中删除“Data”字符串,而无需重写整个内容
或者有比这更好的解决方案吗?

我已经编写了自己的数据表序列化来实现我的目标.

感兴趣的人:

  1. [JsonConverter(typeof(DataTableConverter))]
  2. [XmlRoot("Result")]
  3. public class MyDataTable : IXmlSerializable
  4. {
  5. public MyDataTable(DataTable datatable)
  6. {
  7. this.Data = datatable;
  8. }
  9.  
  10.  
  11. public void WriteXml(XmlWriter writer)
  12. {
  13. foreach (DataRow row in Data.Rows)
  14. {
  15. writer.WriteStartElement(Data.TableName);
  16. foreach (DataColumn column in row.Table.Columns)
  17. {
  18. writer.WriteElementString(column.ColumnName,row[column].ToString());
  19. }
  20. writer.WriteEndElement();
  21. }
  22. }
  23.  
  24. public XmlSchema GetSchema()
  25. {
  26. return null;
  27. }
  28.  
  29. public void ReadXml(XmlReader reader)
  30. {
  31. throw new NotImplementedException();
  32. }
  33. public DataTable Data { get; set; }
  34. }

自定义JSON转换器:

  1. public class DataTableConverter : JsonConverter
  2. {
  3.  
  4. public override bool CanConvert(Type objectType)
  5. {
  6. return typeof(MyDataTable).IsAssignableFrom(objectType);
  7. }
  8.  
  9. public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
  10. {
  11. throw new NotImplementedException();
  12. }
  13.  
  14. public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
  15. {
  16. MyDataTable myDataTable = value as MyDataTable;
  17. DataTable dt = myDataTable.Data;
  18.  
  19. writer.WriteStartArray();
  20.  
  21. foreach (DataRow row in dt.Rows)
  22. {
  23. writer.WriteStartObject();
  24. foreach (DataColumn column in row.Table.Columns)
  25. {
  26. writer.WritePropertyName(column.ColumnName);
  27. serializer.Serialize(writer,row[column]);
  28. }
  29. writer.WriteEndObject();
  30. }
  31.  
  32. writer.WriteEndArray();
  33. }
  34. }

像这样实现新的DataTable类:

  1. public class ValuesController : ApiController
  2. {
  3. // GET api/values
  4. public MyDataTable Get()
  5. {
  6. DataTable dt = new DataTable();
  7. dt.TableName = "info";
  8. using (sqlConnection cn = new sqlConnection("Data Source=(local);Initial Catalog=ApiPoc;Integrated Security=true;"))
  9. {
  10. cn.Open();
  11. using (sqlCommand cm = new sqlCommand("select * from employee",cn))
  12. {
  13. sqlDataReader dr = cm.ExecuteReader();
  14. dt.Load(dr);
  15. }
  16. }
  17. MyDataTable md = new MyDataTable(dt);
  18. return md;
  19. }
  20. }

猜你在找的Json相关文章