Asp.net .NET 4.0 Web API返回不带转义字符的JSON
我读了无数的问题和答案,但还没有看到任何解决问题的方法 我正在使用newtonsoft JSON库,只想从表中返回一些JSON 因此,在我的控制器中,我只需要(为了隐私,服务器和数据库的详细信息被屏蔽): 现在,我读到的许多答案都简单地说是因为您正在IDE中查看结果。在我的例子中,这不是真的,这是浏览器窗口中的输出(尝试了IE和chrome),甚至fiddler也抱怨说,当你说显示JSON输出时,它在位置3处显示无效字符Asp.net .NET 4.0 Web API返回不带转义字符的JSON,asp.net,json,json.net,asp.net-web-api2,Asp.net,Json,Json.net,Asp.net Web Api2,我读了无数的问题和答案,但还没有看到任何解决问题的方法 我正在使用newtonsoft JSON库,只想从表中返回一些JSON 因此,在我的控制器中,我只需要(为了隐私,服务器和数据库的详细信息被屏蔽): 现在,我读到的许多答案都简单地说是因为您正在IDE中查看结果。在我的例子中,这不是真的,这是浏览器窗口中的输出(尝试了IE和chrome),甚至fiddler也抱怨说,当你说显示JSON输出时,它在位置3处显示无效字符 您将看到我已经注释掉了代码,这是我在这里找到的返回JSON的另一种方法,但
您将看到我已经注释掉了代码,这是我在这里找到的返回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
}
展望未来,我可能建议不要在ASP.NET类中进行SQL查询。SQL连接和查询属于数据访问层(DAL)——它应该存储在单独的逻辑层中——存储在单独的项目中,或者至少存储在单独的类中。您可以使用存储库模式(它是一种模式吗?):
//类库中的某个地方
公共课堂演讲
{
公共字符串名称{get;set;}
公共十进制纬度{get;set;}
公共十进制经度{get;set;}
}
公共类地址存储库:IAddressesRepository
{
公共广播[]ReadAll()
{
列表结果=新列表();
var connection=SqlConnectionFactory.CreateAndOpenConnection();
var reader=new SqlCommand(“从[].[]”中选择名称、纬度、经度,连接)。ExecuteReader();
while(reader.Read())
{
结果。添加(新地址){
名称=(字符串)读取器[“名称”],
纬度=(十进制)读卡器[“纬度”],
经度=(十进制)读卡器[“经度”]
});
}
返回结果;
}
}
//在ASP.NET WebAPI中的某个地方
私有地址存储库_addressesRepository=新地址存储库();
公共IHttpActionResult GetHelloWorld()
{
var data=_addressesRepository.ReadAll();
返回Ok(数据);
}
我建议您阅读一些关于分层体系结构和ASP.NET WebAPI本身的书籍,以便获得ASP.NET所有基本问题的答案。您不应该返回序列化对象。您应该返回一个将由ASP.NET序列化的类对象。现在,您序列化了一个序列化对象-这就是为什么您会得到转义引号。感谢您的全面回答Yeldar!
"[{\"name\":\"Aaron's Hill\",\"latitude\":51.18276,\"longitude\":-0.63503},{\"name\":\"Abbas Combe\",\"latitude\":51.00113,\"longitude\":-2.42178},
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
}
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);
}
// 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);
}