我想直接从服务层中的外部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转换为字符串。但我不知道如何避免这种情况。
提前感谢任何想法。
答案 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]}
还有其他一些方法,请参阅以下主题: