我有一个返回JSON的SQL Server proc。我知道proc可以正常工作并返回有效的JSON,因为我可以使用各种工具(包括SQL函数isjson)对其进行测试。
但是,某些工具在调用调用这些proc的API时,无法验证JSON,因为它被用双引号引起来并转义了JSON中的每个双引号。
这是SQL输出:
{"APIResult":[{"ID":200,"Status_Message":"Success","Developer_Message":"Successful login for D56D10AC-3A74-42FC-8BB5-F783A6C0C556 33E4F907-F1E5-4F1B-8CA5-5521291E683A (AppID: (null)).","User_Message":"Successful login","User":[{"ID":"D56D10AC-3A74-42FC-8BB5-F783A6C0C556"}]}]}
这是邮递员的输出:
"{\"APIResult\":[{\"ID\":200,\"Status_Message\":\"Success\",\"Developer_Message\":\"Successful login for D56D10AC-3A74-42FC-8BB5-F783A6C0C556 33E4F907-F1E5-4F1B-8CA5-5521291E683A (AppID: (null)).\",\"User_Message\":\"Successful login\",\"User\":[{\"ID\":\"D56D10AC-3A74-42FC-8BB5-F783A6C0C556\"}]}]}"
某些解析工具(jsonlint)适用于第二种格式,并将其作为有效JSON返回。其他(http://json.parser.online.fr/)则不多。邮递员显然很高兴,但是我的移动开发人员无法使它作为有效的JSON工作。
在这里获得一些帮助之后,我了解到API“应该”正在输出application / JSON的标头内容类型,并且输出不应为字符串。
控制器具有:
public string Get(string key) {
string message = "";
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd2);
da.Fill(ds);
message = ds.Tables[0].Rows[0][0].ToString();
return message;
}
这意味着将其转换为字符串。
所以我的问题是:
如何在输出上设置标头,使其返回JSON而不是字符串?
答案 0 :(得分:0)
数据很可能会被双重序列化。这是实际响应中的转义字符。
由于数据库中的数据已经是JSON字符串,因此按原样返回内容,但是需要对操作进行一些重构。
public IHttpActionResult Get(string key) {
//...
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd2);
da.Fill(ds);
var json = ds.Tables[0].Rows[0][0].ToString();
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(json, Encoding.UTF8, "application/json");
return ResponseMessage(response);
}
原始JSON作为StringContent
直接传递给响应,以避免框架尝试为您序列化。