динамический JSON
интересует собственно как динамически собирать JSON?
как присаивать значения к ключам ето понятно. интересует именно как динамически добавалять ключи и к ним соответсвенно значения? |
Формируете объект и делаете ему JSON.stringify(obj).
|
Спасибо, нашол пример, но если я не ошибаюсь то так не подойдет.
Задача в том что на странице есть несколько input type="text" и нужно сформировать JSON объект имя_поля:значение_поля. в примере который я смотрел, объект сформирован заранее, а количество полей на странице может быть совершенно разное и с разными именами. вот тот пример:
var contact = new Object();
contact.firstname = "Jesper";
contact.surname = "Aaberg";
contact.phone = ["555-0100", "555-0120"];
var memberfilter = new Array();
memberfilter[0] = "surname";
memberfilter[1] = "phone";
var jsonText = JSON.stringify(contact, memberfilter, "\t");
/* the value of jsonText is
'{
"surname": "Aaberg",
"phone": [
"555-0100",
"555-0120"
]
}'
*/
|
Цитата:
|
1)можно пример пожалуйста.
вот например есть два массива: имена и значения var name =['name','email','phone']; var val = ['js','js@js','12312']; нужно софрмировать JSON:
{"name":"js","email":"js@js","phone":"12312"}
2) Цитата:
var obj = {};
obj.name = 'js';
ето понятно. а если name - получаю динамически на странице? например:
var obj = {};
var property = document.getElementById('name');
var key = property.name;
var val = property.value;
//вот как тут добавть?
//obj.key = val;
//так объекту добавится же свойство 'key' а не значение переменной key.
может тут eval в помощь? но не получилось :( разьясните пожалуйста. |
решил пока пробелму так :
k и v масисвы с именами и значениями.
if(k.length == v.length){
var sData = '{';
for(var j=0; j<k.length; j++){
sData = sData + '"'+k[j]+'"'+':'+'"'+v[j]+'",';
}
sData = sData.substr(0,(sData.length-1));
sData = sData + '}';
var t = eval('('+sData+')');
alert(t['name']);
}
не сильно ли криво? п.с. все таки можете пожалуйста разьяснить мне второй вопрос в предыдушем сообшении? п.с.с. и послений вопрос: почему
var t = eval('('+sData+')');
работает, а var t = eval(sData); не работает? в чем суть дополнитеьных скобочек в кавычках? |
Цитата:
|
*fail*
читал и не один раз. как то совершенно из головы вылетело. |
не, это уже *epicfail*:) Ну вот же! Ипрям черным по белому:
var name = 'test' o[name] = 5 |
уже увидел, спасибо )
|
та же беда...
не могу сформировать тело JSON запроса. Вот тело которое посылает броузер
{"controller":"cache","action":"get","params":{"ID":["List:"]},"session":"c10397b9cca89880ad6e"}
через JS собираю тело:
body = { controller: "cache", action: "get", params: { ID: ["List:"]}, session: sesID }; // sesID переменная в которой ID текущей сессии
Вот что уходит в консоле FF на мой запрос
{"controller":"cache","action":"get","params":{"ID":["List:"]},"session":"c10397b9cca89880ad6e"}
но на мой запрос приходит ошибка: error: Object type:"internalException" number: 0 message: "Internal Error" Если посылать запрос без параметров "params":{} то запросы уходя и приходят нормально. Так же пробовал:
body = {};
body.controller = "cache";
body.action = "get";
body.params = {};
body.params.ID = [];
body.params.ID[0] = "List:"; // тут должно быть много элементов, но пока прорабатываю с одним.
body.session = sesID;
Тело такое же...
{"controller":"cache","action":"get","params":{"ID":["List:"]},"session":"c10397b9cca89880ad6e"}
и ответ с ошибкой Подозреваю, что вся беда в формировании массива параметров... Подскажите в чем может быть беда? |
Вы уверены что отправляете json-строку а не объект?
JSON.stringify() используете? |
Spass,
да. перевожу в строку. вот функция отсылки запроса...
function sendJSON(){
console.info("Запрос пошел!");
var date = new Date();
var timeTMP = date.getTime();
var url = urlTMP+date.getTime(); // линк запроса
var dataJSON = JSON.stringify(body); // {} JSON запроса
console.info("Параметры JSON: URL => "+url+" / Объект => "+dataJSON);
var xhr = new XMLHttpRequest();
xhr.open("POST", url , true);
xhr.setRequestHeader('Accept', 'application/json, text/plain, */*');
xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8');
xhr.send(dataJSON);
xhr.onload = function(){
if(xhr.readyState == 4){
console.info("Ответ получен!");
anwJSON = xhr.responseText;
anwJSON = JSON.parse(anwJSON);
anwJSON = anwJSON.cache; // масив {} из ответа
readJSON(); // функция разбора
}
}
}
|
единственное в чем вижу разницу между запросом браузера и моим через JS это "Content-Length"
У броузера на 1 больше... почему не знаю. |
вопрос отпал...
я пробел потерял в теле :) |
Все что присылает сервер идет через JSON.parse, все что посылается на сервер идет через JSON.stringify, на сервере соотв json_encode() & json_decode() если php там. Не надо собирать такие тексты вручную. Что касается транспозинга массивов - просто выводите их почаще в консоль, чтобы научится понимать структуру через графическое представление.
|
| Часовой пояс GMT +3, время: 11:12. |