Преобразовать многомерный массив JavaScript в JSON?

Каков наилучший способ преобразования многомерного массива JavaScript в JSON?

8 ответов

Решение

В большинство популярных JavaScript-фреймворков включены вспомогательные функции JSON. Например, в jQuery есть функция, которая напрямую вызывает URL-адрес и загружает результат JSON как объект: http://docs.jquery.com/Getjson

Однако вы можете получить JSON-анализатор и строковый преобразователь с открытым исходным кодом на веб-сайте json:

https://github.com/douglascrockford/JSON-js

Затем просто включите код и используйте метод JSON.stringify() в вашем массиве.

"Лучший" способ был предоставлен другими авторами. Если вам не нужны полные возможности кодирования указанных библиотек, и вам нужно только кодировать простые массивы, попробуйте следующее:

<!DOCTYPE html>
<html>
<head>
<title>Simple functions for encoding Javascript arrays into JSON</title>
<script type="text/javascript">

window.onload = function() {
  var a = [
    [0, 1, '2', 3],
    ['0', '1', 2],
    [],
    ['mf', 'cb']
  ],
  b = [
    0, '1', '2', 3, 'woohoo!'
  ];
  alert(array2dToJson(a, 'a', '\n'));
  alert(array1dToJson(b, 'b'));
};

function array2dToJson(a, p, nl) {
  var i, j, s = '{"' + p + '":[';
  nl = nl || '';
  for (i = 0; i < a.length; ++i) {
    s += nl + array1dToJson(a[i]);
    if (i < a.length - 1) {
      s += ',';
    }
  }
  s += nl + ']}';
  return s;
}

function array1dToJson(a, p) {
  var i, s = '[';
  for (i = 0; i < a.length; ++i) {
    if (typeof a[i] == 'string') {
      s += '"' + a[i] + '"';
    }
    else { // assume number type
      s += a[i];
    }
    if (i < a.length - 1) {
      s += ',';
    }
  }
  s += ']';
  if (p) {
    return '{"' + p + '":' + s + '}';
  }
  return s;
}

</script>
</head>
<body>
</body>
</html>

Не уверен, что я полностью понимаю ваш вопрос, но если вы пытаетесь преобразовать объект в строку JSON, то, возможно, вы захотите взглянуть на встроенную поддержку JSON во всех новых браузерах. Вот сообщение Ресига об этом. Для браузеров, которые еще не поддерживают его, попробуйте библиотеку json2.js. JSON.stringify(obj) преобразует ваш объект в строку JSON.

Это преобразует все комбинации массивов внутри объектов и наоборот, включая имена функций:

function isArray(a){var g=a.constructor.toString();
   if(g.match(/function Array()/)){return true;}else{return false;}
}
function objtostring(o){var a,k,f,freg=[],txt; if(typeof o!='object'){return false;}
   if(isArray(o)){a={'t1':'[','t2':']','isarray':true}
   }else         {a={'t1':'{','t2':'}','isarray':false}}; txt=a.t1;
   for(k in o){
           if(!a.isarray)txt+="'"+k+"':";
           if(typeof o[k]=='string'){txt+="'"+o[k]+"',";
           }else if(typeof o[k]=='number'||typeof o[k]=='boolean'){txt+=o[k]+",";
           }else if(typeof o[k]=='function'){f=o[k].toString();freg=f.match(/^function\s+(\w+)\s*\(/);
               if(freg){txt+=freg[1]+",";}else{txt+=f+",";};
           }else if(typeof o[k]=='object'){txt+=objtostring(o[k])+",";
           }
   }return txt.substr(0,txt.length-1)+a.t2;
}

Вы можете использовать функцию кодирования этой библиотеки.

var t = {}

for(var i=0;i<3;i++) {
    var _main = {};
    var _dis = {}
    var _check = {};

    _main["title"] = 'test';
    _main["category"] = 'testing';
    _dis[0] = '';
    _dis[1] = '';
    _dis[2] = '';
    _dis[3] = '';
    _check[0] = 'checked';
    _check[1] = 'checked';
    _check[2] = 'checked';
    _check[3] = 'checked';
    _main['values'] = _check;
    _main['disabled'] = _dis;
    t[i] = _main;
}

alert(JSON.stringify(t));

Попробуй это

Использовать этот код и очень просто разработать для более двух массивов

function getJSON(arrayID,arrayText) {    
    var JSON = "[";
    //should arrayID length equal arrayText lenght and both against null
    if (arrayID != null && arrayText != null && arrayID.length == arrayText.length) {
        for (var i = 0; i < arrayID.length; i++) {
            JSON += "{";
            JSON += "text:'" + arrayText[i] + "',";
            JSON += "id:'" + arrayID[i] + "'";
            JSON += "},";
        }
    }
    JSON += "]"
    JSON = Function("return " + JSON + " ;");
    return JSON();
}

и 3 массива

function getJSON(arrayID, arrayText, arrayNumber) {
    var JSON = "[";  
    if (arrayID != null && arrayText != null && arrayNumber!=null && Math.min(arrayNumber.length,arrayID.length)==arrayText.length) {
        for (var i = 0; i < arrayID.length; i++) {
            JSON += "{";
            JSON += "text:'" + arrayText[i] + "',";
            JSON += "id:'" + arrayID[i] + "',";
            JSON += "number:'" + arrayNumber[i] + "'";
            JSON += "},";
        }
    }
    JSON += "]"
    JSON = Function("return " + JSON + " ;");
    return JSON();
}

Я немного изменил ранее предоставленный код... потому что JSON имеет этот формат: [{"object":{"property_1":"value_1","property_2":"value_2"}}]

Итак, код будет...

<!DOCTYPE html>
<html>
<head>
    <title>Simple functions for encoding Javascript arrays into JSON</title>
    <script type="text/javascript">

    window.onload = function(){
      var a = [['property_1','value_1'],['property_2', 'value_2']];
      alert("Comienzo..., paso ////"+a+"\\\\\\ a formato JSON");
      var jsonSerialized = array2dToJson(a, 'object');
      alert(jsonSerialized);
    };

    // Estructura de JSON [{"object":{"property_1":"value_1","property_2":"value_2"}}]

    function array2dToJson(a, p, nl) {
      var i, j, s = '[{"' + p + '":{';
      nl = nl || '';
      for (i = 0; i < a.length; ++i) {
        s += nl + array1dToJson(a[i]);
        if (i < a.length - 1) {
          s += ',';
        }
      }
      s += nl + '}}]';
      return s;
    }

    function array1dToJson(a, p) {
      var i, s = '';
      for (i = 0; i < a.length; ++i) {
        if (typeof a[i] == 'string') {
          s += '"' + a[i] + '"';
        }
        else { // assume number type
          s += a[i];
        }
        if (i < a.length - 1) {
          s += ':';
        }
      }
      s += '';
      if (p) {
        return '{"' + p + '":' + s + '}';
      }
      return s;
    }

    </script>
</head>
<body>
    <h1>Convertir un Array a JSON...</h1>
</body>
</html>

JavaScript правильно закодирует объект:

var a = new Object;
var a = {};

JavaScript не будет кодировать массив:

var a = new Array();
var a = [];
Другие вопросы по тегам