.NET WebApi + DataTable
Я строю проект.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":"John"},{"id":2,"name":"Julia"}]
Есть ли простой способ удалить строку "Данные" из результата JSON, не переписывая все это? Или есть лучшее решение, чем это?
2 ответа
Решение
Я написал свою сериализацию с датой для достижения моей цели.
Для заинтересованных людей:
[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;
}
}