簡體   English   中英

$ .ajax響應在內容類型:application / json中為json中的xml內容生成錯誤

[英]$.ajax response generates error in content-Type:application/json for xml content in json

這很簡單。我想我可能遇到了不兼容的響應內容類型的問題

這是我用來發送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': ''
}

但成功並沒有解決。我正在設置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();

您的問題不在JavaScript代碼或jQuery API用法中。 其他人一樣指出它是在服務器端。 更具體地說,JSON對象鍵必須是雙引號 (更常見的是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);

這將有效地將您的對象轉換為字符串。

您應該為返回類型創建一個強類型對象,然后將其轉換為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;
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM