2

我想直接从服务层中的外部 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 转换为字符串。但我不知道如何避免这种情况。

提前感谢您的任何想法。

4

2 回答 2

4

因为控制器返回一个字符串,所以 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。

于 2012-05-12T06:46:11.343 回答
0

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]}

还有其他几种方法,请参阅这些线程:

于 2012-05-14T07:06:36.487 回答