2015-09-03 22 views
1

我已经阅读了无数的问题和答案,但还没有看到任何解决问题的东西。.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),甚至提琴手抱怨,当你说让我看到JSON输出它说在第3位无效字符。

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

+1

您不应该返回序列化对象。您应该返回一个将由ASP.NET序列化的类对象。现在,你序列化一个序列化的对象 - 这就是为什么你得到逃脱报价。 –

回答

4

你不应该自己序列化对象!
您应该返回一个将由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); 
} 

展望未来,我建议不要把SQL查询你的ASP。 NET类。 SQL连接和查询属于数据访问层(DAL) - 它应该存储在单独的逻辑层中 - 在单独的项目中,或者至少属于单独的类。您可以使用库模式(是一种模式):

// 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.NET。

+0

感谢您的全面解答Yeldar! – garyk1968