Как я могу сделать JSON дочерние узлы (JSON внутри JSON)? - PullRequest
0 голосов
/ 11 августа 2010

Я пытаюсь использовать jquery + json, чтобы получить все элементы в форме и создать JSON-переменную для публикации в методе ASP.NET MVC.

 $.fn.serializeObject = function () {
  var o = {};
  var a = this.serializeArray();
  $.each(a, function () {
   if (o[this.name]) {
    if (!o[this.name].push) {
     o[this.name] = [o[this.name]];
    }
    o[this.name].push(this.value || '');
   } else {
    o[this.name] = this.value || '';
   }
  });
  return o;
 };


 $("#btnPost").click(function () {
     alert(JSON.stringify($("#frm").serializeObject())));
 }); 

Это метод для получения всех полей в форме исоздайте JSON, но он не помещает JSON в JSON.

Пример:

Если у меня есть следующая форма:

<input name="person.name"><input name="person.age"><input name="person.address.street">

Сериализованная строка создает JSON, подобный этому

{ "person.name": "??", "person.age": "??", "person.address.street": "??" }

Мне нужен плагин или какая-то функция для генерации, например:

{ "person": { "name" : "??", "age" : "??", "address":{ "street": "??" } } }

1 Ответ

1 голос
/ 11 августа 2010

Ваша проблема не в том, что "JSON внутри JSON" (что в любом случае является неправильным - JSON прекрасно поддерживает вложение), ваша проблема в том, что вы неправильно поняли, как работает этот процесс.просто читая имена - как строки В javascript нет ничего, что заставляло бы этот процесс "автоматически" разрешать для вас точечную нотацию - точки считаются частью имени свойства.Вам нужно будет разделить имена на периоды и действовать соответственно.Немного рекурсии, и ты здесь.

$.fn.serializeObject = function()
{
  var o = {};
  var a = this.serializeArray();
  $.each( a, function()
  {
    if ( /\./.test( this.name ) )
    {
      resolveProperty( o, this.name.split( '.' ), this.value );                              
    } else {
      o[this.name] = this.value;
    }
  } );
  return o;

  function resolveProperty( object, properties, value )
  { 
    if ( properties.length > 1 )
    {
      var property = properties.shift();

      if ( 'undefined' == typeof object[property] )
      {
        object[property] = {};
      }
      resolveProperty( object[property], properties, value );
    } else {
      object[properties.shift()] = value;
    }
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...