【问题标题】:My .NET API returns JSON as a String. How do I make it return?我的 .NET API 将 JSON 作为字符串返回。我如何让它返回?
【发布时间】:2019-07-07 20:48:04
【问题描述】:

我有一个返回 JSON 的 SQL Server proc。我知道 proc 正在工作并返回有效的 JSON,因为我可以使用包括 SQL 函数 isjson 在内的各种工具对其进行测试。

但是,一些工具在调用我的 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/),没那么多。 Postman 显然很高兴,但我的移动开发人员无法让它作为有效的 JSON 工作。

在这里得到一些帮助后,我了解到 API“应该”输出应用程序/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 而不是字符串?

【问题讨论】:

  • 更新问题以包含控制器操作定义。动作的返回类型是什么?
  • 这是标题。消息定义为字符串 public string Get(string key) { string message = "";
  • JSON 是一个字符串,但是当您在选择的调试工具中显示一个字符串时,它可能会将字符串用双引号 " 括起来,并转义字符串中包含的任何双引号。这不是字符串的文字内容,它只是字符串内容的表示。

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


【解决方案1】:

数据很可能被双重序列化。这是实际响应中的转义字符。

由于数据库中的数据已经是 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 直接传递给响应,以避免框架尝试为您序列化它。

【讨论】:

  • 完美的恩科西,谢谢。正是我需要的。幸运的是,我现在必须把大约 80 个电话变成这个:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多