我的.NET API以字符串形式返回JSON。如何使它退货?

时间:2019-02-13 21:52:28

标签: c# asp.net json asp.net-web-api

我有一个返回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而不是字符串?

1 个答案:

答案 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直接传递给响应,以避免框架尝试为您序列化。