. net 4.0 Web API返回没有转义字符的JSON



我读了无数的问题和答案,但还没有看到任何解决问题的方法。

我正在使用newtonsoft JSON库,只是想从表中返回一些JSON。

所以在我的控制器中,我只是有(服务器和数据库的详细信息空白的隐私):

    public IHttpActionResult GetHelloWorld()
    {
        string JSONResult;
        SqlConnection conn = new SqlConnection("Server=<servername>;Database=<dbname>;user=<username>;password=<password>");
        DataTable table = new DataTable();
        conn.Open();
        SqlCommand cmd = new SqlCommand("select name, latitude, longitude from [<schema>].[<tablename>]", conn);
        using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
        {
            adapter.Fill(table);
        }
        //System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        //List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        //Dictionary<string, object> row;
        //foreach (DataRow dr in table.Rows)
        //{
        //    row = new Dictionary<string, object>();
        //    foreach (DataColumn col in table.Columns)
        //    {
        //        row.Add(col.ColumnName, dr[col]);
        //    }
        //    rows.Add(row);
        //}
        //return Ok(serializer.Serialize(rows),);
        JSONResult = JsonConvert.SerializeObject(table);
        return Ok(JSONResult);
    }

现在它像预期的那样返回结果集,但是如果不转义双引号,我就无法让它返回,所以数据看起来像这样:

"[{"name":"Aaron's Hill","latitude":51.18276,"longitude":-0.63503},{"name":"Abbas Combe","latitude":51.00113,"longitude":-2.42178},

现在我读到的许多答案只是说,这是因为你正在看IDE的结果。在我的情况下,这不是真的,这是浏览器窗口中的输出(尝试了IE和chrome),甚至fiddler抱怨当你说show me JSON输出它说无效字符在位置3。

你会看到我已经注释掉了代码,这是我在这里找到的返回JSON的另一种方法,但仍然转义引号。不知道还能尝试什么?

你不应该自己序列化对象!
你应该返回一个类对象,它将被ASP.NET序列化。现在,ASP。. NET序列化一个序列化的对象——这就是为什么你会得到转义引号。

应该是这样的:

public IHttpActionResult GetHelloWorld()
{
    SqlConnection conn = new SqlConnection("Server=<servername>;Database=<dbname>;user=<username>;password=<password>");
    DataTable table = new DataTable();
    conn.Open();
    SqlCommand cmd = new SqlCommand("select name, latitude, longitude from [<schema>].[<tablename>]", conn);
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
    {
        adapter.Fill(table);
    }
    return Ok(table); // DO NOT serialize
}

然而,返回一个DataTable对象听起来是错误的——它不会被正确序列化。
你需要返回代表你的实体的自定义对象,像这样(只是一个例子,可能不工作):

public IHttpActionResult GetHelloWorld()
{
    List<YourCustomClass> result = new List<YourCustomClass>();
    SqlConnection conn = new SqlConnection("Server=<servername>;Database=<dbname>;user=<username>;password=<password>");
    conn.Open();
    SqlCommand cmd = new SqlCommand("select name, latitude, longitude from [<schema>].[<tablename>]", conn);
    var reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        result.Add(new YourCustomClass {
            Name = (string)reader["name"],
            Latitude = (decimal)reader["latitude"],
            Longitude = (decimal)reader["longitude"]
        });
    }
    return Ok(result);
}

展望未来,我可能会建议不要在您的ASP中进行SQL查询。网类。SQL连接和查询属于数据访问层(DAL)——它应该存储在一个单独的逻辑层中——在一个单独的项目中,或者至少在一个单独的类中。您可以使用Repository模式(是模式吗?):

// Somewhere in a class library
public class Address
{
    public string Name { get; set; }
    public decimal Latitude { get; set; }
    public decimal Longitude { get; set; }
}
public class AddressesRepository : IAddressesRepository
{
    public Address[] ReadAll()
    {
        List<YourCustomClass> result = new List<YourCustomClass>();
        var connection = SqlConnectionFactory.CreateAndOpenConnection();
        var reader = new SqlCommand("select name, latitude, longitude from [<schema>].[<tablename>]", connection).ExecuteReader();
        while (reader.Read())
        {
            result.Add(new Address {
                Name = (string)reader["name"],
                Latitude = (decimal)reader["latitude"],
                Longitude = (decimal)reader["longitude"]
            });
        }
        return result;
    }
}
// Somewhere in ASP.NET WebAPI
private IAddressesRepository _addressesRepository = new AddressesRepository();
public IHttpActionResult GetHelloWorld()
{
    var data = _addressesRepository.ReadAll();
    return Ok(data);
}

我建议阅读一些关于分层架构和ASP的书籍。. NET WebAPI本身,以便得到所有基本的ASP。净的问题。

相关内容

  • 没有找到相关文章