【问题标题】:.NET WebApi + DataTable.NET WebApi + 数据表
【发布时间】:2013-01-28 21:52:55
【问题描述】:

我正在构建一个 .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 结果中删除“数据”字符串,而无需重写整个内容? 还是有比这个更好的解决方案?

【问题讨论】:

    标签: datatable json.net


    【解决方案1】:

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

    对于感兴趣的人:

    [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;
        }
    }
    

    【讨论】:

    【解决方案2】:

    尝试将 [XmlElement] 放在 Data 上方。

    【讨论】:

    • 没什么作用。我正在寻找一种方法来告诉 JSON 格式化程序将“数据”字符串排除在外。
    • 你用什么来生成 JSON?
    • 我使用的是 JSON.net 默认的 JsonConverter。但我想我必须写一个自定义的来得到我想要的
    猜你喜欢
    • 2016-07-21
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2015-03-29
    • 2013-04-27
    相关资源
    最近更新 更多