Отправить массив JavaScript с использованием JSON или XML? Как превратить его в XML? - PullRequest
2 голосов
/ 19 апреля 2009

Хорошо, моя ситуация такова: мне нужно отправить содержимое массива JavaScript на сервер, где скрипт PHP сохранит отдельные записи массива в базе данных MYSQL. Я не использую jQuery, но собираюсь интегрировать инфраструктуру Prototype в мой проект.

Я понял, что массив JS можно легко преобразовать в JSON с помощью метода toJSON (), предоставленного Prototype. Затем я мог бы отправить это в мой сценарий, который каким-то образом де-JSONизирует массив и вставляет значения в БД.

Но меня также интересует не использование формата обмена данными JSON, а преобразование массива JS в XML, который можно очень легко проанализировать с помощью PHP-расширения simplexml (сэкономьте немного времени на стороне сервера). Мой вопрос (ы), таким образом: я должен пойти на JSON или XML? и как я могу превратить массив JS в XML? (есть ли метод toXML (), как и в Prototype toJSON ()?)

Мне известно о множестве очень похожих вопросов, но все они, похоже, задают этот вопрос наоборот ... преобразование JSON в JS-массивы, и многие из них связаны с jQuery. Поэтому, пожалуйста, помогите мне, даже если это потенциально дубликат, и вы, возможно, ответили на это в другом месте.

Ответы [ 4 ]

4 голосов
/ 19 апреля 2009

Вы пробовали методы расширения php_json? Используя их, вы сможете превратить объект JSON в объект PHP.

Оттуда вы можете делать все, что захотите. Создайте строку XML для обработки с SimpleXML или сохраните в хранилище данных.

2 голосов
/ 19 апреля 2009

Вы действительно сэкономите время разработки, если будете использовать встроенный php json_decode

1 голос
/ 19 апреля 2009

После использования toJSON () вы можете использовать это для преобразования JSON в XML из goessner.net ( исходный файл ):

/*  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.

0 голосов
/ 20 апреля 2009

Я предлагаю использовать собственную строку запроса, которая исключит весь процесс преобразования. Вот код, который сделает соответствующее преобразование:

/**
 * 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. Если вы один из них, вы можете легко изменить функцию, чтобы она служила отдельной функцией. Если нужна помощь, просто ударь меня;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...