2013-10-31 27 views
1

應用/ JSON這是非常simple.I想我可能有不兼容的響應內容類型

一個問題,這個問題,我的代碼利用發送一個jQuery Ajax請求:

var settings = { dataType: 'json', 
       url: 'services/loadTemplate.ashx', 
       data: JSON.stringify({ 'Name': element.name }), // element.name }, 
       processData: false, 
       //contentType: "application/json; charset=utf-8", 
       type: 'POST', 
       success: function (data) { 
       console.log('successData:'+data); 
        alert(data); 
       }, 
       error: function (xhr, status, error) { 
        var err = eval("(" + xhr.responseText + ")"); 
        alert(err.Message); 
       } 
      } 
      $.ajax(settings); 

,這是我試圖在success回調來獲取響應。

{ 
    'name': 'sMan', 
    'svg1': '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="513" height="490"><desc>Created with Raphaël</desc><defs></defs><text x="50.5" y="50" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" font-size="0px" style="text-anchor: middle; font-style: normal; font-variant: normal; font-weight: normal; font-size: 0px; line-height: normal; font-family: Arial;"><tspan>Text</tspan></text><image x="173.5" y="79.5" width="176" height="158" preserveAspectRatio="none" xlink:href="uploaded/75884f70-8872-49c1-8337-2cbbca626b2e.png" id="P28m" fill="#ff0000" stroke="#000000" stroke-width="1" fill-opacity="1" stroke-opacity="1" font-family="Calibri" style="stroke-width: 1px; fill-opacity: 1; stroke-opacity: 1; font-family: Calibri;"></image></svg>', 
    'svg2': '' 
} 

但成功並不fired.I正在設置在服務器端請求處理context.Response.ContentType = "application/json";和我簡單地寫上面的字符串到response.Whats正確的方式做到這一點?

編輯

返回這樣說:

return "{'name':'" + name + @"', 
       'svg1':'" + dt.Rows[0]["svg1"].ToString() + @"', 
       'svg2':'" + dt.Rows[0]["svg2"].ToString() + "'}"; 

這工作:

StringBuilder sb = new StringBuilder(); 
     StringWriter sw = new StringWriter(sb); 
     using (JsonWriter jsonWriter = new JsonTextWriter(sw)) 
     { 
      jsonWriter.Formatting = Formatting.Indented; 
      // jsonWriter.WriteStartArray(); 
      jsonWriter.WriteStartObject(); 
      jsonWriter.WritePropertyName("name"); 
      jsonWriter.WriteValue(name); 
      jsonWriter.WritePropertyName("svg1"); 
      jsonWriter.WriteValue(dt.Rows[0]["svg1"].ToString()); 
      jsonWriter.WritePropertyName("svg2"); 
      jsonWriter.WriteValue(dt.Rows[0]["svg2"].ToString()); 
      jsonWriter.WriteEndObject(); 

      /* return "{'name':'" + name + @"', 
       'svg1':'" + dt.Rows[0]["svg1"].ToString() + @"', 
       'svg2':'" + dt.Rows[0]["svg2"].ToString() + "'}";*/ 
     } 

     return sb.ToString(); 
+4

這不是有效的JSON,你需要使用分隔雙引號,不是單引號中的字符串。 –

+0

@AonyonyGrist你的意思是說''svg1「:」 Nezam

+3

使用合適的JSON編碼器而不是自己構建字符串,將是最好的方法。另外,我個人不喜歡在JSON中嵌套XML的想法,我會考慮使用純XML格式。 – DaveRandom

回答

2

你的問題是不是在你的JavaScript代碼,或在您的jQuery API使用情況。像others已經指出它在服務器端。更具體地說,JSON對象鍵have to be double quotes(更一般的JSON字符串必須雙引號)。

正如您在發佈的代碼中使用C#和ASP.NET一樣。根據您使用的框架,您有其他選擇。在所有情況下,我建議你使用一個對象,而不是自己構建JSON。

var yourObj = new {name=name,svg1=dt.Rows[0]["svg1"].ToString(),svg2=dt.Rows[0]["svg2"].ToString()} 

現在你有一個代表你的數據的C#對象。

如果你正在使用類似的ASP.NET MVC:

return Json(yourObj,JsonBehavior.AllowGet); 

如果您使用的WebAPI你可以做

return yourObj; // will figure out JSON conversion itself 

如果您使用別的,或者你正在使用的任何東西本身不支持JSON響應。你需要從的NuGet獲得Newtonsoft.JSON包並返回:

return JsonConvert.SerializeObject(yourObj); 

這將你的對象轉換爲字符串有效。

+0

謝謝我使用C#asp.net 3.4 webforms.Thanks爲WebAPI部分雖然我用Newtonsoft解決問題。 任何指向JSON上WebApi使用示例的指針都會非常好 – Nezam

+1

@Nezam WebAPI做一些名爲「Content Negotiation」的內容。這意味着你可以從它返回正常的C#對象,它會根據客戶請求的內容找出返回它的格式。因此,它會自動響應JSON序列化返回值的JSON請求,並通過XML序列化返回值等來響應XML請求。 –

+0

這意味着asp.net 3.5應該默認支持它嗎? – Nezam

2

您應該爲返回類型創建一個強類型對象,然後將其轉換爲JSON。

public class Template 
{ 
    public string Name {get; set;} 
    public string SvgXml1 {get; set;} 
    public string SvgXml2 {get; set;} 
} 

然後在你的服務器端。ASHX:

var template = new Template 
{ 
    Name = name, 
    SvgXml1 = dt.Rows[0]["svg1"].ToString(), 
    SvgXml2 = dt.Rows[0]["svg2"].ToString() 
}; 

return JsonConvert.SerializeObject(template); 
在你成功的回調函數

最後:

var name = data.Name; 
var svg1 = data.SvgXml1; 
... 
+1

這個答案在幾個協議中是錯誤的。如果我們忽視顯而易見(名稱不適合,它是JsonConvert而不是JSONConvert)和錯誤信息(您不需要爲它明確聲明實際的類),給定OP的代碼$ .parseJSON仍然不是必需的。更不用說它從3分鐘前就不會在我的答案上添加_useful_信息。 –

+0

@BenjaminGruenbaum你的意見。用於返回數據的強類型類是良好開發的標誌。這意味着服務器端方法將始終符合數據協議,而不依賴於魔術字符串。感謝您通知我有關錯字,但您可以編輯它而不是downvoting。談論一個過度膨脹的自我! – tranceporter

+0

@BenjaminGruenbaum $ .parseJSON有什麼問題? – tranceporter