2009-05-01 3 views
2

Кто-нибудь знает, как конвертировать объект JSON в поля вложенной формы.Преобразование объекта JSON в вложенные поля формы?

Например: рассмотрим JSON объект:

{'a':{'b':{'c':'1200'}}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}} 

я должен получить:

{'a[b][c]':'1200', 'z':'foo', 'bar[baz]':'1', 'bar[id]':2}; 

Любые идеи?

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

+1

Что вложенное поле формы? Являются ли эти элементы набора полей? Я не совсем понимаю, какой алгоритм вы даже подразумеваете, чтобы перейти от первого объекта ко второму. – Anonymous

+0

Ум, что, собственно, этот беспорядок? Возможно, вам нужно будет дать некоторые пояснения, потому что это не имеет большого смысла без дополнительного контекста ... –

+0

Был бы тот факт, что вы уже можете ссылаться на элементы как obj ['a'] ['b' ['c' ] немного измените алгоритм прохождения формы в поле? – Thevs

ответ

3

Итак, я не знаю, почему вы хотите делать то, что вы говорите, и хотите, чтобы вы наполнили нас всем, но этот код должен быть достаточно близко, чтобы вы могли его подстроить (это основана на some code of mine that I use to find differences in JavaScript object graphs):

function doStrangeThing(obj) { 
    var propertyChanges = []; 
    var objectGraphPath = []; 
    (function(obj, refObj) { 
     if (obj.constructor == Object || (obj.constructor != Number && 
      obj.constructor != String && obj.constructor != Date && obj.constructor != Boolean && 
      obj.constructor != RegExp && obj.constructor != Function)) { 
      for (var property in obj) { 
       objectGraphPath.push((objectGraphPath.length > 0) ? "[" + property + "]" : property); 
       if (obj[property].constructor != Function) { 
        if (!refObj[property]) refObj[property] = {}; 
        arguments.callee(obj[property], refObj[property]); 
       } 
       objectGraphPath.pop(); 
      } 
     } else if (obj.constructor != Function) { 
      if (obj != refObj) { 
       propertyChanges.push("\"" + objectGraphPath.join("") + "\":\"" + obj.toString() + "\""); 
      } 
     } 
    })(obj, {}); 
    return "{" + propertyChanges.join(",") + "}"; 
} 

Вот что я сделал, чтобы проверить это:

doStrangeThing({'a':{'b':{'c':'1200'}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}}); 

какие результаты этого значения:

{"a[b][c]":"1200","z":"foo","bar[baz]":"1","bar[id]":"2"} 

Надеется, что это полезно для вас в некотором роде ...

+0

как только это достигнет serveride, в php он становится вложенной картой хэша. – user86847

+0

Ну, если это сработает для вас, отметьте это как ответ - я ничего не знаю о PHP или о необходимости этого, но, очевидно, у вас есть свои причины.:) Опять же, возможно, он может использовать небольшую настройку, чтобы сделать это ТОЧНО, как вам бы хотелось, но это было относительно быстро для меня, чтобы проверить и поиграть, так как я написал этот код совсем недавно ... –

+0

Когда я говорю «tweak», между прочим, я хочу, чтобы типы значений работали правильно - я вижу, что вы хотите, чтобы значение «bar [id]» было буквальным номером 2, а не строкой («2»)) - вы можете настроить код для проверки, чтобы узнать, является ли что-то числом, и если да, не используйте цитаты; и т. д. –

1
obj = {'a':{'b':{'c':'1200'}}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}} 

внутренне эквивалентно

{['a']['b']['c']:'1200', ['z']:'foo', ['bar']['baz']:'1', ['bar']['id']:2} 

Пожалуйста, обратите внимание, что это не объект JSON больше.

Вы уже можете обратиться первые свойства объекта таким образом:

var z = obj['a']['b']['c'] // 1200 

достаточно ли для ваших нужд? Вы действительно хотите преобразовать имена свойств в переменные?

+0

Мне приходилось смеяться, когда я читал этот ответ, потому что я думаю, что чувствую то же чувство, какое испытывал у меня, когда читал вопрос - т. Е. WTF этот парень собирается делать с этим беспорядком ?! Тем не менее, это было интересное упражнение, но я не знаю, что «неизвестно» делает с этим материалом в PHP. Странные вещи. –

+0

На самом деле, я получил то, что хотел. Довольно странно, но у него есть какое-то влияние. Тем не менее, существует множество простых алгоритмических способов достижения одной и той же цели ... И был бы большой беспорядок с именами переменных и пространствами имен, если бы он был реализован для общего использования. – Thevs

0

Я бы рекомендовал функцию, которая принимает вложенный объект JSON и превращает его в строку HTTP POST. jQuery будет принимать это за все свои аргументы, которые требуют параметров HTTP.

Я написал и использовал функцию ниже в нескольких производственных приложений (использование на свой страх и риск):

$.httpSerialize = function(items, parentName) { 
    var serializedItems = [], serialize = arguments.callee, encodeItem =  function(key, value) { 
     if (value === null || typeof value == 'undefined') return value; 
     if (value.constructor == Array) {return serialize(value, key);} 
     return (value.constructor == Object) 
      ? serialize(value, key) 
      : (value === true || value === false) 
       ? key+"="+new Number(value) 
       : key+"="+encodeURIComponent(value); 
    }; 

    if (items.constructor == Array) { 
     parentName = parentName || 'item'; 
     for (var i = 0; i < items.length; i++) { 
      var key = parentName+'['+i+']', value = items[i]; 
      serializedItems.push(encodeItem(key, value)); 
     } 
    } else { 
     parentName = parentName || ''; 
     for (var key in items) { 
      var value = items[key]; 
      if (parentName) { 
       serializedItems.push(encodeItem(parentName+'['+encodeURIComponent(key)+']', value)); 
      } else { 
       serializedItems.push(encodeItem(encodeURIComponent(key), value)); 
      } 
     } 
    } 
    return serializedItems.join("&"); 
}; 
Смежные вопросы