【问题标题】:Remove ContentEncoding From JsonResult从 JsonResult 中删除 ContentEncoding
【发布时间】:2020-10-11 22:34:01
【问题描述】:

我想从数据表中生成 json,我已经尝试过了

public static JsonResult ConvertFromDataTable(DataTable dataTable)
    {
        var result = new List<dynamic>();
        foreach (DataRow row in dataTable.Rows)
        {
            dynamic dyn = new ExpandoObject();
            foreach (DataColumn column in dataTable.Columns)
            {
                var dic = (IDictionary<string, object>)dyn;
                dic[column.ColumnName] = row[column];
            }
            result.Add(dyn);
        }

        string _json = JsonConvert.SerializeObject(result);

        var resultJSON = new JsonResult
        {
            Data = JsonConvert.DeserializeObject(_json),
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };

        return resultJSON;
    }

但结果总是在我的 json 上有“ContentEncoding”、“ContentType”,

{
"ContentEncoding": null,
"ContentType": null,
"Data": [
    {
        "Name": "Steve",
        "Age": "30",
        "Photo": "steve.png",
        "Gender": "Male"
    },
    {
        "Name": "Sarah",
        "Age": "19",
        "Photo": "sarah.png",
        "Gender": "Female"
    }
],
"JsonRequestBehavior": 0,
"MaxJsonLength": null,
"RecursionLimit": null
}

我只需要我的 json 中的“数据”,可以删除它吗?

【问题讨论】:

  • 真的需要返回JsonResult吗?
  • 我的意思是,你可以从 Api 返回强类型的结果,它也将是 json
  • @RomanKalinchuk 更好的是,它将是调用者请求的 JSON XML(甚至更多)
  • @SirRufo 是的,但默认可以是 json。或不。没有框架版本还不清楚:) 但仍然很容易配置
  • 还记录了如何从 api 控制器返回数据Tutorial: Create a web API with ASP.NET Core: Return Values

标签: c# asp.net json datatable


【解决方案1】:

这只是你如何做到这一点的一个例子。

我更喜欢这种方式,因为:

  1. 当您返回强类型数据时,您的控制器更具可读性。您(和您的队友)很清楚 - 将从该控制器返回哪些数据。

  2. 我建议尽可能避免使用动态类型。您可以在 When should one use dynamic keyword in c# 4.0?

    阅读更多相关信息

代码:

public class Person
{
    public string Name { get; set; }
    public string Age { get; set; }
    public string Photo { get; set; }
    public string Gender { get; set; }
}

public static List<Person> ConvertFromDataTable(DataTable dataTable)
{
    var result = new List<Person>();

    foreach (DataRow row in dataTable.Rows)
    {
        var person = new Person();

        foreach (DataColumn column in dataTable.Columns)
        {
            switch (column.ColumnName)
            {
                case "Name":
                    person.Name = row[column].ToString();break;

                case "Age":
                    person.Age = row[column].ToString(); break;

                case "Photo":
                    person.Name = row[column].ToString(); break;

                case "Gender":
                    person.Name = row[column].ToString(); break;
            }
        }

        result.Add(person);
    }

    return result;
}

//your api method there
public List<Person> GetPersons()
{
    DataTable dt = new DataTable();
    //here you populate your DataTable
    return ConvertFromDataTable(dt);
}

此外,您可以进行一些通用扩展来将 DataTable 转换为类型化对象,您可以在此处看到一个示例:How to Convert DataTable to Generic List in C#

【讨论】:

    【解决方案2】:

    您可以使用 Newtonsoft JSON 库轻松转换它

        DataTable table = new DataTable();
        DataColumn idColumn = new DataColumn("id", typeof(int));
        idColumn.AutoIncrement = true;
    
        DataColumn itemColumn = new DataColumn("item");
        table.Columns.Add(idColumn);
        table.Columns.Add(itemColumn);
    
    
        for (int i = 0; i < 2; i++)
        {
            DataRow newRow = table.NewRow();
            newRow["item"] = "item " + i;
            table.Rows.Add(newRow);
        }
    
        //produces formatted string, to avoid it omit the parameter from the method call
        string json = JsonConvert.SerializeObject(table, Formatting.Indented);
        
    

    输出

    [
      {
        "id": 0,
        "item": "item 0"
      },
      {
        "id": 1,
        "item": "item 1"
      }
    ]
    

    请参考小提琴here

    参考https://www.newtonsoft.com/json/help/html/SerializeDataSet.htm

    【讨论】:

    • 输出是字符串对吗?我试过你的方法,但结果是这样的: "[\r\n {\r\n \"Name\": \"Steve\",\r\n \"Age\": \"30\" ,\r\n \"照片\": \"steve.png\",\r\n \"性别\": \"男性\" },\r\n {\r\n \"姓名\" : \"Sarah\",\r\n \"年龄\": \"19\",\r\n \"照片\": \"sarah.png\",\r\n \"性别\" : \"女性\" }\r\n]"
    • 可以关闭缩进属性来避免换行和回车。在此处参考更新的小提琴dotnetfiddle.net/PSg5oW
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多