Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   динамический JSON (https://javascript.ru/forum/misc/10256-dinamicheskijj-json.html)

hangover 24.06.2010 18:15

динамический JSON
 
интересует собственно как динамически собирать JSON?

как присаивать значения к ключам ето понятно. интересует именно как динамически добавалять ключи и к ним соответсвенно значения?

Kolyaj 24.06.2010 18:18

Формируете объект и делаете ему JSON.stringify(obj).

hangover 24.06.2010 18:33

Спасибо, нашол пример, но если я не ошибаюсь то так не подойдет.
Задача в том что на странице есть несколько 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"
    ]
}'
*/

Kolyaj 24.06.2010 18:38

Цитата:

Сообщение от hangover
а количество полей на странице может быть совершенно разное и с разными именами.

И что? Проблема-то в чём?

hangover 24.06.2010 19:07

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 в помощь? но не получилось :(


разьясните пожалуйста.

hangover 24.06.2010 19:24

решил пока пробелму так :

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);

не работает?

в чем суть дополнитеьных скобочек в кавычках?

Sweet 24.06.2010 19:39

Цитата:

Сообщение от hangover
//вот как тут добавть?
//obj.key = val;
//так объекту добавится же свойство 'key' а не значение переменной key.

Не поленись почитать про объекты, и узнаешь что нужно делать так obj[key] = val; Тогда и объекты не eval'ом создавать будешь:)

hangover 24.06.2010 19:51

*fail*

читал и не один раз. как то совершенно из головы вылетело.

Sweet 24.06.2010 19:56

не, это уже *epicfail*:) Ну вот же! Ипрям черным по белому:
var name = 'test' 
o[name] = 5

hangover 24.06.2010 19:57

уже увидел, спасибо )

Benos 19.07.2016 12:15

та же беда...
не могу сформировать тело 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"}

и ответ с ошибкой

Подозреваю, что вся беда в формировании массива параметров...
Подскажите в чем может быть беда?

Spass 19.07.2016 12:39

Вы уверены что отправляете json-строку а не объект?
JSON.stringify() используете?

Benos 19.07.2016 13:17

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();  // функция разбора
              }
        }   
}

Benos 19.07.2016 13:46

единственное в чем вижу разницу между запросом браузера и моим через JS это "Content-Length"
У броузера на 1 больше... почему не знаю.

Benos 19.07.2016 14:06

вопрос отпал...
я пробел потерял в теле :)

warren buffet 19.07.2016 15:23

Все что присылает сервер идет через JSON.parse, все что посылается на сервер идет через JSON.stringify, на сервере соотв json_encode() & json_decode() если php там. Не надо собирать такие тексты вручную. Что касается транспозинга массивов - просто выводите их почаще в консоль, чтобы научится понимать структуру через графическое представление.


Часовой пояс GMT +3, время: 14:00.