Преобразовать объект JSON во вложенные поля формы? - PullRequest
2 голосов
/ 02 мая 2009

Всем известен хороший способ преобразования объекта 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, и мне кажется, что что-то вроде этого уже существует, если нет, я могу просто сделать свой собственный сумасшедший алгоритм, но я бы лучше использовал что-то с проверенным послужным списком.

Ответы [ 3 ]

3 голосов
/ 02 мая 2009

Итак, я понятия не имею, почему вы хотите делать то, что, как вы говорите, вы хотите сделать, и я надеюсь, что вы нас всех напишите, но этот код должен быть достаточно близок, чтобы вы могли его настроить на основе некоторого моего кода, который я использую, чтобы найти различия в графах объектов JavaScript ):

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"}

Надеюсь, это вам пригодится ...

1 голос
/ 02 мая 2009
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 голосов
/ 02 мая 2009

Я бы порекомендовал функцию, которая принимает вложенный объект 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("&");
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...