【问题标题】:Send JavaScript array using JSON or XML? How to turn it to XML?使用 JSON 或 XML 发送 JavaScript 数组?如何将其转换为 XML?
【发布时间】:2010-10-20 10:08:14
【问题描述】:

好的,我的情况是这样的:我需要将 JavaScript 数组的内容发送到服务器,PHP 脚本会将单个数组条目保存在 MYSQL 数据库中。我没有使用 jQuery,但我即将将 Prototype 框架集成到我的项目中。

我收集到使用 Prototype 提供的 toJSON() 方法可以轻松地将 JS 数组转换为 JSON。然后我可以将其发布到我的脚本中,该脚本会以某种方式对数组进行 de-JSONise 并将值插入 DB。

但我也感兴趣的不是使用 JSON 数据交换格式,而是将 JS 数组转换为 XML,这可以很容易地被 simplexml PHP 扩展解析(为我自己节省一些服务器端的开发时间)。因此,我的问题是:我应该选择 JSON 还是 XML?以及如何将 JS 数组转换为 XML? (有没有类似 Prototype 中的 toJSON() 的 toXML() 方法?)

我知道各种各样的非常相似的问题,但他们似乎都在反过来问这个问题……将 JSON 转换为 JS 数组,而且很多都与 jQuery 相关。所以请帮助我,即使这可能是重复的并且您可能已经在其他地方回答过这个问题。

【问题讨论】:

    标签: php javascript xml json prototypejs


    【解决方案1】:

    使用 toJSON() 后,您可以使用它来将 JSON 转换为 XML,从 goessner.net (source file):

    /*  This work is licensed under Creative Commons GNU LGPL License.
    
        License: http://creativecommons.org/licenses/LGPL/2.1/
        Version: 0.9
        Author:  Stefan Goessner/2006
        Web:     http://goessner.net/ 
    */
    function json2xml(o, tab) {
       var toXml = function(v, name, ind) {
          var xml = "";
          if (v instanceof Array) {
             for (var i=0, n=v.length; i<n; i++)
                xml += ind + toXml(v[i], name, ind+"\t") + "\n";
          }
          else if (typeof(v) == "object") {
             var hasChild = false;
             xml += ind + "<" + name;
             for (var m in v) {
                if (m.charAt(0) == "@")
                   xml += " " + m.substr(1) + "=\"" + v[m].toString() + "\"";
                else
                   hasChild = true;
             }
             xml += hasChild ? ">" : "/>";
             if (hasChild) {
                for (var m in v) {
                   if (m == "#text")
                      xml += v[m];
                   else if (m == "#cdata")
                      xml += "<![CDATA[" + v[m] + "]]>";
                   else if (m.charAt(0) != "@")
                      xml += toXml(v[m], m, ind+"\t");
                }
                xml += (xml.charAt(xml.length-1)=="\n"?ind:"") + "</" + name + ">";
             }
          }
          else {
             xml += ind + "<" + name + ">" + v.toString() +  "</" + name + ">";
          }
          return xml;
       }, xml="";
       for (var m in o)
          xml += toXml(o[m], m, "");
       return tab ? xml.replace(/\t/g, tab) : xml.replace(/\t|\n/g, "");
    }
    

    也就是说,我个人会选择 JSON。

    【讨论】:

    • 这看起来有点……麻烦。首先转换为 JSON,然后转换为 XML……我喜欢 JSON 的简单性,我更喜欢 JSON,就像你说的那样。在 0..10 范围内,PHP 前端的情况会有多复杂?如果我将它传递给 JSON,我是否可以像使用 simplexml 解析 XML 一样轻松地将 JSONised 对象转换为 PHP 对象?
    • 是的,确实很麻烦。但它(应该)工作。另外,我刚刚发现 us.php.net/json_decode 可能很有趣。
    • 谢谢。另一个用户也向我指出了那个方向。似乎很简单。我想我会避免使用 XML :)
    【解决方案2】:

    你尝试过 php_json 扩展方法吗?使用它们,您将能够将 JSON 对象转换为 PHP 对象。

    从那里你可以做任何你想做的事。创建一个 XML 字符串以使用 SimpleXML 处理或持久保存到 DataStore。

    【讨论】:

    • 好的,这听起来不错。所以你会推荐 JSON 来传输 JS 数组?
    • 我从未尝试过这些扩展,但显然我的服务器已启用它们,我会试一试。谢谢!
    • 我会说您可以使用 JSON 进行传输,并在服务器端使用 json_encode()、json_decode() 将 JSON 消息转换为 PHP 变量/对象。试一试。
    【解决方案3】:

    如果你使用php内置的json_decode,你会真正节省开发时间

    【讨论】:

      【解决方案4】:

      我建议使用本机查询字符串,这将消除所有转换过程。这是将进行适当转换的代码:

      /**
       * This function serializes the object to a standart URI query string which can directly interpreted by PHP.
       * 
       * @param {String} [format] The desired format for the output. Not needed for most usages.
       * @return {String} The URI query string.
        */
      Object.prototype.toQueryString=function(format, encodeURI)
      {
          if (typeof format!='string')
              format='%s';
          var result='';
          for (var paramName in this) 
          {
              if (this.constructor==Array && isNaN(parseInt(paramName)) || !this.hasOwnProperty(paramName))
                  continue;
      
              if (this[paramName].constructor==Object || this[paramName].constructor==Array)
                  result += '&' + this[paramName].toQueryString(format.format(paramName) + '[%s]', encodeURI);
              else
                  result += '&' + format.format(paramName) + '=' + ((encodeURI!==false)?encodeURIComponent(this[paramName]):this[paramName]);
          }
          return result.substr(1);
      };
      

      有些人可能不喜欢使用 Object.prototype。如果您是其中之一,则可以轻松更改该功能以用作单独的功能。如果需要帮助,请敲我;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-27
        • 2014-03-19
        • 2016-07-03
        • 2018-12-04
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多