【问题标题】:JSON from c# asmx returns escaped string format not JSON object来自 c# asmx 的 JSON 返回转义字符串格式而不是 JSON 对象
【发布时间】:2014-01-06 03:51:26
【问题描述】:

我的 JSON 作为转义字符串返回,我想要没有反斜杠和外引号的对象。我确定我缺少演员表或一些简单的东西,但我会将完整的代码放在这里以避免误解。

我正在尝试通过 ajax/JSON/asmx Web 服务将一些数据导入 Infragistics Ignite UI 网格。我有数据返回,但格式不正确。我不确定问题出在我的 ajax js 或 c# 方法返回类型(字符串)还是 JSON 序列化?

以下是我如何使用 jquery ajax 调用来调用 Web 服务:

    var jqxhr = $.ajax(
                {
                    type: 'POST',
                    contentType: "application/json; charset=utf-8",
                    url: "/WebMethods/AssetWebService.asmx/GetAssets",
                    dataType: "json",
                    success: success,
                    error: function (xhr, msg) { alert(msg + '\n' + xhr.responseText); }
                });

    function success(msg) {
        var entityColumns = getColumns();
        var entityData = msg.d;
        gridSetup(entityData, entityColumns);
    }

    function gridSetup(entityData, entityColumns) {
        $("#assetGrid").igGrid(
            {
                autoGenerateColumns: false,
                autoGenerateLayouts: false,
                dataSource: entityData,
                columns: entityColumns
            }
       );
    }

Webservice c# 代码从实体框架获取对象:

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class AssetWebService : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetAssets()
        {
            List<Asset> Assets  = new List<Asset>();

        using (var db = new CognyxMES())
        {
            Assets = db.Assets.ToList();
        }

        var results = from a
                          in Assets
                          select new
                          {
                              Id = a.Id,
                              Name = a.Name,
                              AssetTypeId = a.AssetTypeId
                          };
        return results;            
        }
    }

当我在 VS2013 中调试时,返回的 JSON 看起来像这样(这导致我的网格不显示任何数据):

"[{\"Id\":3,\"Name\":\"My Asset\",\"AssetTypeId\":1}]"

当我硬编码时,我希望它看起来像这样,因为我的网格可以正常工作:

[{ "Id": 3, "Name": "My Asset", "AssetTypeId": 1 }]

我是 C# 的 JSON 新手,所以我知道我可以使用字符串替换或类似的方法将其破解到位,但我正在寻求更优雅的修复并解释我所缺少的内容。谢谢

【问题讨论】:

    标签: c# ajax json web-services entity-framework


    【解决方案1】:

    你返回的 IS 是一个字符串,而不是 JSON。那是你的问题。

    你的方法应该是这样的。 ASP.NET 为您处理其余的事情。

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public IEnumerable<object> GetAssets()
        {
            using (var db = new assetEntities())
            {
                var results = from a
                              in db.Assets
                              select new
                              {
                                  Id = a.Id,
                                  Name = a.Name,
                                  AssetTypeId = a.AssetTypeId
                              };
                return results;
            }
        }
    

    Based on your jQuery request you have specified that you want JSON and yourResponseFormat = ResponseFormat.Jsonreturned` 强制执行此操作...因此您的 Web 服务将为您序列化对 JSON 的响应。十分简单。无需手动序列化。

    【讨论】:

    • 感谢您的快速回复和示例代码,我现在明白并且可以正常工作了。一旦我更新了返回类型,我收到了一个“dbcontext 已被处理”错误,因此我更新了我的示例以反映修改后的 GetAssets() 方法。干杯
    【解决方案2】:
    ResponseFormat = ResponseFormat.Json
    

    您刚刚告诉 ASP.Net 将您的响应转换为 JSON。
    因此,您应该返回一个原始对象,而不是 JSON 字符串。

    通过返回一个字符串,您是在告诉 ASP.Net 将 该字符串 序列化为 JSON,这不是您想要的。

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      相关资源
      最近更新 更多