Javascript $.ajax响应在内容类型中生成错误:json中xml内容的application/json

Javascript $.ajax响应在内容类型中生成错误:json中xml内容的application/json,javascript,jquery,ajax,json,httphandler,Javascript,Jquery,Ajax,Json,Httphandler,这很简单。我想我可能有一个不兼容的响应内容类型的问题 这是我用来发送jQuery ajax请求的代码: var settings = { dataType: 'json', url: 'services/loadTemplate.ashx', data: JSON.stringify({ 'Name': element.name }), // element.name }, processData:

这很简单。我想我可能有一个不兼容的响应内容类型的问题

这是我用来发送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
callback中获取的响应

{
  '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': ''
}
这起作用了:

 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获取包并返回:

return JsonConvert.SerializeObject(yourObj);

这将有效地将对象转换为字符串。

您的问题不在于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获取包并返回:

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;
...

您应该为返回类型创建一个强类型对象,然后将其转换为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;
...


这不是有效的JSON,您需要使用双引号而不是单引号来分隔字符串。@AnthonyGrist您的意思是说
“svg1”:使用合适的JSON编码器,而不是自己构建字符串,这将是最好的方法。我个人也不喜欢将XML嵌套在JSON中的想法,我会考虑使用纯XML格式。您还需要将
'name':'sMan',
更改为
“name”:“sMan”,
,等等(不要忘了在
svg1
的值内转义双引号)。但是,如果您确实返回了一个有效的JSON字符串,我希望它能正常工作。@DaveRandom XML是一个SVG图形,他正在传递信息和与该信息相关的图形。我不明白为什么JSON不适合这里。我同意如果有效负载只是xml,那么使用xml会更有意义。这不是有效的JSON,您需要使用双引号而不是单引号来分隔字符串。@AnthonyGrist您的意思是说
“svg1”:使用合适的JSON编码器,而不是自己构建字符串,这将是最好的方法。我个人也不喜欢将XML嵌套在JSON中的想法,我会考虑使用纯XML格式。您还需要将
'name':'sMan',
更改为
“name”:“sMan”,
,等等(不要忘了在
svg1
的值内转义双引号)。但是,如果您确实返回了一个有效的JSON字符串,我希望它能正常工作。@DaveRandom XML是一个SVG图形,他正在传递信息和与该信息相关的图形。我不明白为什么JSON不适合这里。我同意如果有效负载只是xml,那么使用xml会更有意义。感谢我使用的是C#asp.net 3.4 webforms。感谢WebAPI部分,尽管我使用了Newtonsoft解决了这个问题。任何指向JSON上WebApi使用示例的指针都将非常有用good@NezamWebAPI做了一件叫做“内容协商”的事情。这意味着您可以从它返回普通的C#对象,它将根据客户端的请求确定返回的格式。因此,它通过json序列化返回值来自动响应json请求,并通过xml序列化返回值来响应xml请求,等等。这意味着asp.net 3.5在默认情况下应该支持它?@Nezam no,它是WebAPI框架的一部分。在内部,它使用Newtonsoft.JSON.interest。我不知道WebAPI在内部使用JSON.NET。谢谢你的信息!感谢我使用的是C#asp.net 3.4 webforms。感谢WebAPI部分,尽管我使用了Newtonsoft解决了这个问题。任何指向JSON上WebApi使用示例的指针都将非常有用good@NezamWebAPI做了一件叫做“内容协商”的事情。这意味着您可以从它返回普通的C#对象,它将根据客户端的请求确定返回的格式。因此,它通过json序列化返回值来自动响应json请求,并通过xml序列化返回值来响应xml请求,等等。这意味着asp.net 3.5在默认情况下应该支持它?@Nezam no,它是WebAPI框架的一部分。在内部,它使用Newtonsoft.JSON.interest。我不知道WebAPI在内部使用JSON.NET。谢谢你的信息!这个答案在几个方面都是错误的。如果我们忽略了明显的(名称不合适,它是JsonConvert而不是JsonConvert)和错误信息(您不需要显式地为它声明一个实际的类),给定OP的代码,$.parseJSON仍然是不需要的。更不用说,这并没有在我3分钟前的回答之上添加有用的信息。@BenjaminGruenbaum这是你的观点。用于返回数据的强类型类是良好发展的标志。这意味着