在C#Newtonsoft中将DataTable序列化为JSON对象

时间:2017-11-13 14:04:28

标签: c# json sql-server asp.net-web-api json.net

我正在使用ASP.NET开发WEB API。序列化数据表时我有点麻烦。当我序列化DataTable时,它被序列化为Json String。但我需要JSON对象或JSON ARRAY。

我的代码

[ActionName("EMPID")]
public System.Collections.IEnumerable Get()
{
    SqlConnection myConnection = new SqlConnection();
    string connString = ConfigurationManager
                          .ConnectionStrings["DefaultConnection"]
                          .ConnectionString;

    myConnection.ConnectionString = connString;
    DataTable dataTable = new DataTable();

    string query = "select EMPLOYEE_ID,FIRST_NAME,SALARY from Employee ";

    SqlConnection conn = new SqlConnection(connString);
    SqlCommand cmd = new SqlCommand(query, conn);
    conn.Open();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dataTable);

    var JSONString = JsonConvert.SerializeObject(dataTable);
    return JSONString;
}

public class Employee
{
    public int EmployeeId { get; set; }
    public string Name { get; set; }
    public int ManagerId { get; set; }
}

但它以JSON String的形式返回。我需要作为JSON对象。

示例

  

" [{\" EMPLOYEE_ID \":2,\" FIRST_NAME \":\"迈克尔\" \&# 34; SALARY \":800000},{\" EMPLOYEE_ID \":3,\" FIRST_NAME \":\"罗伊\" ,\" SALARY \":700000},{\" EMPLOYEE_ID \&#34:4,\" FIRST_NAME \":\"汤姆\ " \" SALARY \":600000},{\" EMPLOYEE_ID \":5,\" FIRST_NAME \":\&# 34;杰里\" \" SALARY \":650000},{\" EMPLOYEE_ID \":6,\" FIRST_NAME \" :\"菲利普\" \" SALARY \":7500000},{\" EMPLOYEE_ID \":7,\" FIRST_NAME \ ":\"萨钦\" \" SALARY \":1100000},{\" EMPLOYEE_ID \":8,\&# 34; FIRST_NAME \":\"安舒\" \" SALARY \":1200000},{\" EMPLOYEE_ID \":9 ,\" FIRST_NAME \":\"奸污\" \" SALARY \":1000000}]"

但我需要序列化为Object Like,

  

{"名称":"马纳斯""两性":"男性""生日":& #34; 1987年8月8日"}

我对JSON Serialization& amp;反序列化。

1 个答案:

答案 0 :(得分:2)

1)停止使用DataTable。它们是数据的糟糕抽象。使用强类型对象。 Dapper对此非常方便。它是一个微型ORM,可与任何ADO.NET数据提供程序一起使用。您提供查询,它会将查询结果映射到强类型对象(类)。 Dapper可用on NuGet

2)您的行动方法不应该返回left。它应该返回right

3)您应该让框架处理将对象转换为JSON,而不是自己动手。没有必要涉及JSON.NET。如果从action方法返回对象,框架会将它转换为JSON。

4)您没有在一次性对象(SqlConnection)上正确使用IDisposable模式。它们需要包含在IEnumerable语句中,或者在IEnumerable<T>块中处理。

5)你有两个SqlConnection,只需要一个。

6)您应该使用存储库模式,而不是直接在控制器中进行数据访问。关注问题的分离,有一个单独的类负责此事。

数据存储库

using

控制器

finally

模型

using Dapper; //add this to your using statements

public class EmployeeRepository
{
    private readonly string _connectionString;

    public EmployeeRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public List<Employee> GetAllEmployees()
    {
        string query = "select EMPLOYEE_ID, FIRST_NAME, SALARY from Employee";

        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            // Query is an extension method from Dapper
            List<Employee> employees = connection.Query<Employee>(query).AsList();
            return employees;
        }
    }
}

如果您不想使用Dapper,可以手动处理命令的结果:

public class EmployeeController
{
    private readonly EmployeeRepository _employeeRepository;

    public EmployeeController()
    {
        string connString = ConfigurationManager
                                .ConnectionStrings["DefaultConnection"]
                                .ConnectionString;

        _employeeRepository = new EmployeeRepository(connString);
    }

    [ActionName("EMPID")] //why does this say EMPID?
    public IEnumerable<Employee> Get()
    {            
        List<Employee> employees = _employeeRepository.GetAllEmployees();
        return employees;      
    }
}