从服务中检索 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 并传递给 ApiController

由于控制器返回一个字符串,因此 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# 动态对象?