анализировать JSON с YUI с [] вокруг {} в пакете - PullRequest
0 голосов
/ 16 февраля 2012

Я довольно новичок в JSON, javascript, YUI и пытаюсь выполнить домашнее задание.У меня есть JSON-пакет в форме

[{"id":"1234", "name":"some description","description":"url":"www.sd.com"}, {same format as previous one}]

. Я попытался использовать пример с YUI, чтобы поставить jsonString следующим образом:

var jsonString = '{"id":"1234", "name":"some description","description":"url":"www.sd.com"}';
var messages = [];
messages = YAHOO.lang.JSON.parse(jsonString);

, затем распечататьрезультат в сообщениях [].В примере с jsonString я получаю вывод.При попытке сделать это с веб-сервера профессора, я получаю ошибку при разборе.Я предполагаю, что это связано с тем, что его пакет окружен [], а мой нет в моем примере.Я попытался сделать

YAHOO.lang.JSON.parse(professorResponse[0]);

, и это также вернуло ошибку.Мне было интересно, какой лучший формат / методы в этом сценарии, что делать с чем-то, переданным с веб-сервера, с точки зрения того, как отформатировать данные, чтобы я мог их проанализировать.У меня нулевой опыт в этой области, и я хочу начать хорошо.Спасибо.

Редактировать:

To parse the web server's response, I'm doing this:

function sendRequest() {
  var url = "class website&response=JSON";
  var callback = {success:handleResponse, failure:handleFailure, timeout:5000};
  var transaction = YAHOO.util.Connect.asyncRequest("GET", url, callback, null);
}

// this gets called when my handleResponse methods looks if it's JSON vs XML and sees that the server's response is JSON
function parseJSONResponse(response) {
  var messages = [];
  try {
    messages = YAHOO.lang.JSON.parse(response);
  }
  catch (e) {
    alert("JSON parse failed");
    return;
  }
}

Я продолжаю получать сбой анализа JSON, когда пытаюсь разобрать ответ.

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

Это недопустимый JSON, каждому ключу нужно значение. Вам не хватает значения для "описания"

{"id":"1234", "name":"some description","description":"url":"www.sd.com"}
             //there is no value for "description ---^

Это должно выглядеть примерно так:

{"id":"1234", "name":"some description", "description":"testing", "url":"www.sd.com"}
1 голос
/ 17 февраля 2012

Ваш пример и профессор являются недопустимыми JSON, которые не могут быть проанализированы, потому что оба содержат свойство "description", которое не имеет значения:

... "description":"url":"www.sd.com" ...

Должно быть:

... "description": "somevalue", "url":"www.sd.com" ...

(или просто удалить "description":)

В остальной части моего ответа предполагается, что вышеизложенное можно исправить, прежде чем продолжить ...

Вы не объясняете, как вы получаете JSON вашего профессора или как вы генерируете свой вывод, но в общем смысле JSON - это строковое представление объекта или массива, которое вы затем анализируете создать реальный объект или массив. Ваш пример - это представление объекта. Пример вашего профессора - представление массива объектов.

Если вы ошибаетесь, вы, похоже, пытаетесь обработать professorResponse как массив и получить доступ к его элементу 0 с помощью professorResponse[0] до того, как проанализируете его, но если это JSON затем это строка, представляющая массив, а не фактический массив, поэтому вам нужно сначала проанализировать его:

// get professorResponse from server somehow
var professorResponse = '[{"id":"1234", "name":"some description","description":"fixed","url":"www.sd.com"}, {same format as previous one}]';

var parsedResponse = YAHOO.lang.JSON.parse(professorResponse);

// now parsedResponse is an array of objects, so
parsedResponse.length   // is 2 - there are two elements
parsedResponse[0]       // is first element, i.e., {"id":"1234", "name":"some description","description":"url":"www.sd.com"}
parsedResponse[1]       // is second element
parsedResponse[0].id    // is "1234"
parsedResponse[0].name  // is "some description"

Примечание: в вашем примере вы инициализируете messages для ссылки на пустой массив, но затем немедленно присваиваете ему значение, равное возвращаемому из YAHOO.lang.JSON.parse(jsonString), который в этом случае не будет массивом ( потому что ваша jsonString представляет объект, который не является массивом) - ваш исходный пустой массив выбрасывается.

«что делать с чем-то, переданным с веб-сервера, с точки зрения того, как отформатировать данные, чтобы я мог их проанализировать».

Если веб-сервер возвращает действительный JSON, вам не нужно форматировать его для его анализа - это уже будет строка в формате, который можно проанализировать с помощью JSON.parse().

0 голосов
/ 17 февраля 2012

Ну [] это массив и {} объект.

Так что если бы у вас было следующее:

var jsonString =='{"id":"1234", "name":"some description","description":"url":"www.sd.com"}';

jsonString.id вернул бы 1234.

Таким образом, в этом примере сверху:

var someData = [{"id":"1234", "name":"some description","description":"url":"www.sd.com"}, {same format as previous one}]

Вы должны использовать:

someData[0].id, чтобы получить идентификатор первого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...