我正在使用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;反序列化。
答案 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;
}
}