【问题标题】:Convert C# String into Javascript Object/JSON将 C# 字符串转换为 Javascript 对象/JSON
【发布时间】:2012-08-28 20:25:12
【问题描述】:

我有一个这样的 Javascript 对象:

var jsonDataActual = { 
                       "source": [{
                                    "name": "testCaption0", 
                                    "desc": "testDescrip0", 
                                    "values": [{ 
                                                 "from": "/Date(1338811241074)/", 
                                                   "to": "/Date(1346760041074)/", 
                                                "label": "testLabel0", 
                                          "customClass": "GanttRed"
                                               }] 
                                 }], 
                       "navigate": "scroll", 
                        "scale": "weeks", 
                        "maxScale": "months", 
                        "minScale": "days", 
                    "itemsPerPage": 11, 
                     "onItemClick": function (data) { }, 
                      "onAddClick": function (dt, rowId) { } 

                 };

它对我来说很好用。现在,由于我的要求和需要,我将整个对象(包括大括号 ie{ } 和分号 ;)作为服务器端(C#)上的字符串,并使用服务器端方法将其返回给 ajax 调用(web 方法):

在服务器端方法中,我执行以下操作:

return  new JavaScriptSerializer().Serialize(jsonData);

但是现在整个返回的数据(在 Success: function(msg){ var s=msg.d} 内)被视为字符串,因此它不起作用。

我试过这些:

  1. var obj = eval('{' + msg.d +'}'); (removing beginning and ending braces in msg.d)
         typeof(obj) is string. failed

  2. eval('var obj ='+msg.d);  (including beginning and ending braces in msg.d)
         typeof(obj) is string. failed

  3. var obj= jQuery.parseJson(msg.d);
        typeof(obj) is string. failed
  4. var obj = new Object();
     //var obj = {}; 
      obj=jQuery.parseJson(msg.d).
      typeof(obj) is string. failed.

请帮忙。如何将服务器端返回的 json 转换为对象?

为什么它不适合我??是因为我的 json 对象的结构吗??

为什么jsonDataActual 对我有效,但在作为字符串发送时无效???

我看到了thisthis..

请帮忙.....

【问题讨论】:

    标签: c# json jquery javascriptserializer


    【解决方案1】:

    找到解决我的具体问题的方法。

    我正在用我的 json 数据作为它的值来构造一个字符串变量。然后我会将此字符串返回给客户端函数(发出 ajax 请求的函数)。即

    服务器端方法

    [WebMethod]
    public static string GetJsonData()
    {
        string jsonData = String.Empty;
        foreach(var dataItem in objEntireData.Items)
        {
             //  jsonData +=  
        }
       return new JavaScriptSerializer().Serialize(result);
    } 
    

    但它不起作用。所以我没有构造一个字符串变量并序列化它,而是编写了一个具有特定结构的类并在返回语句中发送它(序列化后)。

    即请参阅下面的课程

        public class A
        {
            public A()
            {
                Values = new List<B>();
            }
            public string prop1 {get; set;}
            public List<B> Values { get; set; }
        }
        public class B
        {
            public string prop2 { get; set; }
            public string prop3 { get; set; }
        }
    

    我会像下面这样使用这个类:

    [WebMethod]
    public static string GetJsonData()
    {
              List<A> objA = new List<A>();
              A objAItem = new A();
              foreach (var dbItem in objDataBaseValues)
              {
                    objA.prop1 = "test";
                    B objBItem = new B();
                    b.prop2="value";
                    b.prop3="value";
                    objA.Values.Add(objBItem);
              }
            return new JavaScriptSerializer().Serialize(objA);
    
      }
    

    将我的整个数据打包成一个类结构,然后序列化这对我有用。我的客户端函数成功地将其识别为一个对象,即

     $.ajax({
                        type: "POST",
                        url: "ProjectGanttChart.aspx/getData",
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function (msg) {
                            var jsonData = jQuery.parseJSON(msg.d);
                            populateGantt(jsonData);
                         }
              }); 
    

    【讨论】:

      【解决方案2】:

      试试这个

      var json=(typeof msg.d) == 'string' ? eval('(' + msg.d + ')') : msg.d;
      

      【讨论】:

      • 。它对我不起作用。像往常一样,typeof(json) 是字符串,这意味着 eval 没有将我的字符串转换为对象
      【解决方案3】:

      我以前遇到过很多次。当 WCF 服务将返回的数据解密为 JSON 时,字符串数据将始终带有“”。您应该始终从 WCF 服务返回对象或对象列表 - 即使这些是在您的服务级别创建的自定义对象。

      所以,你的服务应该是:

      [OperationContract]
              [WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/Test?testId={testId}", RequestFormat = WebMessageFormat.Json,
                         ResponseFormat = WebMessageFormat.Json)]
              List<TestObjectJSON> Test(int testId);
      

      这将在服务端为您执行反序列化,而无需使用序列化程序。

      【讨论】:

      • @thexdixon..请参阅我没有使用 WCF 或 Web 服务。我的方法只是保存在一个 aspx 页面上。平面 asp.net.
      • 我不太确定如何在 WebMethod 上完成解析,但如果您使用的是 .NET 4+,那么我可以想象它与服务的序列化相同。您能否尝试快速执行自定义对象方法并查看是否可行?
      【解决方案4】:

      如何将服务器端返回的 json 转换为对象?

      您可以使用JSON.parse 来执行此操作。

      例子:

      a = [1, 2];
      x = JSON.stringify(a); // "[1,2]"
      o = JSON.parse(x); // [1, 2];
      

      【讨论】:

      • 天哪。甚至 JSON.parse 也无济于事。由于 JSON.parse(msg.d) 而不是 object..goddd,我再次得到了字符串
      • 你想要一个对象是什么意思?您可以使用 var o = {"s":"string here"}; // now o.s = "string here"! 将字符串放入对象中
      • 哇...请阅读问题金鹦鹉。此外, var o={"s":"string here"} 对我没有用,我希望“string here”成为一个对象,而不是包含在另一个对象中。即“这里的字符串”里面有很多键和值,我需要访问它们。我希望我有意义
      • 哦!我的错。顺便说一句,你能试试吗:var obj= jQuery.parseJson(jQuery.parseJson(msg.d));
      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多