Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net .NET 4.0 Web API返回不带转义字符的JSON_Asp.net_Json_Json.net_Asp.net Web Api2 - Fatal编程技术网

Asp.net .NET 4.0 Web API返回不带转义字符的JSON

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的另一种方法,但

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

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

因此,在我的控制器中,我只需要(为了隐私,服务器和数据库的详细信息被屏蔽):

现在,我读到的许多答案都简单地说是因为您正在IDE中查看结果。在我的例子中,这不是真的,这是浏览器窗口中的输出(尝试了IE和chrome),甚至fiddler也抱怨说,当你说显示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
}
展望未来,我可能建议不要在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);
}