从服务中检索 Json 并传递给 ApiController
本文关键字:ApiController Json 服务 检索 | 更新日期: 2023-09-27 18:33:51
我想直接从服务层中的外部API捕获JSON,将其返回到MVC 4 ApiController,然后通过该ApiController输出JSON。 我基本上是在另一个 API 服务周围编写一个包装器,因为其他一些操作必须同时发生(身份验证等(。 问题是 JSON 被转换为字符串,并在我的 C# 代码中作为字符串传递。 这只会将转义字符添加到 JSON 中。 无论如何,我可以在我的 C# 代码中传递 JSON 对象吗? 我的实施细节如下。
在服务层中,我正在使用一个通过以下方法提供 JSON 的 API。
return new WebClient().DownloadString(url);
不幸的是,这将返回一个字符串。 由于此 API 已经向我返回了 JSON,因此存在问题,因为字符串中添加了许多转义字符。
JSON应该看起来像这样
[{"Citation":{"Attachments":[{"AttachedPersonIds":null,..."Type":"Record"}]
但相反,它现在看起来像这样
"[{'"Citation'":{'"Attachments'":[{'"AttachedPersonIds'":null,...'"Type'":'"Record'"}]"
获得此字符串后,我通过几个方法将其返回到 ApiController(设置为返回 JSON(,如下所示。
public class HintsController : ApiController
{
public string Get(string treeId, string personId)
{
return _hintService.GetHints(treeId, personId);
}
}
我尝试将字符串转换为文字字符串,并尝试再次序列化字符串。 这样做只会添加更多的转义字符,并不能解决问题。 我认为问题在于我如何使用初始调用,因为它将其从 JSON 转换为字符串。 但我不知道如何避免这种情况。
提前感谢您的任何想法。
由于控制器返回一个字符串,因此 JSON 格式化程序会将整个字符串序列化为 JSON 字符串并转义嵌入的引号字符。
你可以做这样的事情:
public HttpResponseMessage Get()
{
var resp = new HttpResponseMessage()
{
Content = new StringContent("{json here...}")
};
resp.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/json");
return resp;
}
这假定您始终希望返回 JSON。
如果你真的想传递对象,你可以把它变成一个dynamic
的对象并传递它。
我不知道字面上的转义字符是从哪里来的,你能不能更清楚一点。 是 API 生成它们,还是我们的代码中有其他点? 我以前在调试窗口中见过它们,当时字符串实际上并不包含它们,并且打印/等工作正常。
您可以使用 Json.net(标准(,内置的序列化程序,https://github.com/jsonfx/jsonfx 等。
从 jsonfx 站点:
var reader = new JsonReader(); var writer = new JsonWriter();
string input = @"{ ""foo"": true, ""array"": [ 42, false, ""Hello!"", null ] }";
dynamic output = reader.Read(input);
Console.WriteLine(output.array[0]); // 42
string json = writer.Write(output);
Console.WriteLine(json); // {"foo":true,"array":[42,false,"Hello!",null]}
还有其他几种方法,请参阅这些线程:
- 使用 Json.net 将 json 对象反序列化为动态对象
- 将 JSON 反序列化为 C# 动态对象?