2012-05-11 30 views
2

我想直接從服務層的外部API中捕獲JSON,並將其返回給MVC 4 ApiController,然後通過該ApiController輸出JSON。我基本上是圍繞另一個API服務編寫包裝,因爲其他一些操作必須同時發生(身份驗證等)。問題在於JSON被轉換爲字符串,並在我的C#代碼中作爲字符串傳遞。這只是將轉義字符添加到JSON中。無論如何,我可以在我的C#代碼中傳遞JSON對象嗎?我的實施細節如下。從服務中檢索Json並傳遞給ApiController

在服務層,我正在使用通過以下方法提供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

當你在看這個串?它可能只是調試版本 – scottm

+0

當通過ApiController輸出字符串時,它具有轉義字符。我不認爲調試器會添加不存在的轉義字符。 – Pinski

+0

認爲您需要將其作爲內容設置爲StringContent對象的HttpResponseMessage返回。否則,你會得到一個轉義字符串。 – dez

回答

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。

+0

正是我需要的。用最少的代碼編輯完美修復它。非常感謝你! – Pinski

0

如果您確實想要傳遞對象,您可以將它轉換爲dynamic對象並將其傳遞給對象。

我不知道文字轉義字符來自哪裏,你可以更清楚一點。是API生成它們,還是在我們的代碼中還有其他一點?我之前在調試窗口中看到過它們,當字符串沒有實際包含它們時,打印/ etc正常工作。

您可以使用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]} 

還有一些其他的方式方法,請參閱以下主題:

相關問題