从服务中检索Json并传递给ApiController

时间:2012-05-11 21:58:31

标签: c# asp.net asp.net-mvc-4

我想直接从服务层中的外部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);
    }
}

我尝试将字符串转换为Literal字符串并尝试再次序列化字符串。这样做只会添加更多转义字符,并且无法解决问题。我认为问题在于我是如何消耗初始调用的,因为它将它从JSON转换为字符串。但我不知道如何避免这种情况。

提前感谢任何想法。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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]}

还有其他一些方法,请参阅以下主题: