JSON Простая итерация над массивом - PullRequest
3 голосов
/ 22 апреля 2011

Обновлено с фактическим ответом JSON, перепутано в прошлый раз.

Это мой второй день с JSON, и я застрял на первом этапе моего проекта.

я создал службу отдыха wcf, которая дает этот тест json-ответ.

[{
"busyEndTime":"\/Date(928164000000-0400)\/",
"busyStartTime":"\/Date(928164000000-0400)\/",
"endGradient":1.26743233E+15,
"startGradient":1.26743233E+15,
"status":"String content"

}]

Я пытаюсь прочитать содержимое этого вывода и использовать его для различных других целей. По содержанию я имею в виду значения «busyEndTime, busyStartTime» и т. Д.

Я пробовал множество примеров в сети, но моя неудача продолжается,

Ниже приведены способы, которые я пытался прочитать выше, но не получилось.

$('#btnGetTime').click(function () {
    $.ajax({
        cache: false,
        type: "GET",
        async: false,
        url: serviceAddress,
        dataType: "application/json; charset=utf-8",
        data: "{}",

 success: function (student) {

************** ***** Попробуйте 1

var obj = jQuery.parseJSON(student);
for (var i = 0; i < obj.length; i++) {
       alert(obj[i]);
}

********** Попробуйте 2

var obj = eval("(" + student + ")");
for (var i = 0; i < obj.length; i++) {
      alert(obj[i]);
                            }

************** Попробуйте 3

success: test(student)
.......
.....
function test(jObject) {
  var jArrayObject = jObject
  if (jObject.constructor != Array) {
      jArrayObject = new Array();
      jArrayObject[0] = jObject;
  }

************** Попробуйте 4

success: test(student)
.......
.....
function test(jObject) {
    var jArrayObject = jObject
    for (var i = 1, n = jObject.length; i < n; ++i) {
         var element = jObject[i];
................
....................
} 

************** * Try5

                    $.each(jArrayObject, function (key, value) {
                        alert(key + ": " + value);
                    });

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

Быстрый ответ - все, что я хочу, я теряю интерес к jquery с каждой минутой. (

Ответы [ 2 ]

4 голосов
/ 22 апреля 2011

Обновление : Теперь, когда вы опубликовали фактический текст JSON, вот пример его использования:

$.getJSON(url, function(data) {
  // jQuery will deserialize it into an object graph for
  // us, so our `data` is now a JavaScript object --
  // in this case, an array. Show how many entries we got.
  display("Data received, data.length = " +
          data.length);

  // Show the start and end times of each entry
  $.each(data, function(index) {
    display("Entry " + index +
            ": Start = " + this.busyStartTime +
            ", end = " + this.busyEndTime);
  });
});

Живая копия

Вывод:

Loading JSON from /aduji4/4...
Data received, data.length = 1
Entry 0: Start = /Date(928164000000-0400)/, end = /Date(928164000000-0400)/

Обратите внимание, что даты не обрабатываются автоматически, если вы не используете "reviver" с анализатором JSON, который понимает этот конкретный формат даты.У JSON нет собственного формата даты, но он имеет концепцию «reviver», которую можно использовать во время процесса десериализации для предварительной обработки значений.

У собственного анализатора JSON jQuery нет «reviver»"есть возможность, но вы можете скачать те, которые есть (их три на страница Дугласа Крокфорда на github - Крокфорд является изобретателем JSON).Тогда вы скажете jQuery , а не , анализировать JSON, и вместо этого сделаете это явно самостоятельно.Это будет выглядеть так:

// Start loading the JSON data
$.ajax({
  url: url,
  dataType: "text", // Tell jQuery not to try to parse it
  success: function(data) {

    // `data` contains the string with the JSON text.
    // Deserialize it. jQuery's own JSON parser doesn't
    // have the "reviver" concept, but this is where you
    // would use one that does, giving it the reviver.
    data = $.parseJSON(data);

    // Now we have the object graph (an array in this
    // case), show how many entries it has.
    display("Data received, data.length = " +
            data.length);

    // Show the start and end times of each entry
    $.each(data, function(index) {
      display("Entry " + index +
              ": Start = " + this.busyStartTime +
              ", end = " + this.busyEndTime);
    });
  },
  error: function() {
    display("Error loading JSON");
  }
});

Живая копия

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


Оригинальный ответ :

Проблема

Я создал службу отдыха wcf, которая дает этот тест JSON-ответ.

Это не JSON.Вы можете прочитать о JSON здесь , и вы можете проверить свои строки JSON здесь .Я не совсем уверен, что это такое.Он очень похож на XML, но, как кто-то взял XML из средства просмотра дерева или чего-то такого (эти - символы рядом с началами элементов).

Ниже я покажу, как эти данные могут выглядетькак в JSON, как вы будете работать с ним, а затем, если вы хотите вместо этого работать с XML, тот же пример с использованием данных XML.

Ваши данные в формате JSON

Вот идеякак это может выглядеть в JSON:

{
    "ArrayOfBusyDateTime": [
        {
            "busyEndTime":   "2011-04-20T10:30:00",
            "busyStartTime": "2011-04-20T10:00:00",
            "endGradient":   0,
            "startGradient": 0,
            "status":        "busy"
        },
        {
            "busyEndTime":   "2011-04-20T13:00:00",
            "busyStartTime": "2011-04-20T12:00:00",
            "endGradient":   0,
            "startGradient": 0,
            "status":        "busy"
        }
    ]
}

Обратите внимание, что типы (имена элементов) исчезли, потому что в JSON нет понятия имен элементов.(Если вы хотите их, вы можете создать ключ, который содержит соответствующую информацию.) Таким образом, каждая из двух записей в массиве является busyDateTime в силу того, что находится в ArrayOfBusyDateTime.Но одна из особенностей JSON заключается в том, что он очень податлив, поэтому вы можете предпочесть сделать это немного по-другому.

Работа с этими данными JSON

Вот пример использования этих данных:

$.getJSON(url, function(data) {
  // jQuery will deserialize it into an object graph for
  // us, so our `data` is now a JavaScript object.
  // Show how many entries we got in the array:
  display("Data received, ArrayOfBusyDateTime.length = " +
          data.ArrayOfBusyDateTime.length);

  // Show the start and end times of each entry
  $.each(data.ArrayOfBusyDateTime, function(index) {
    display("Entry " + index +
            ": Start = " + this.busyStartTime +
            ", end = " + this.busyEndTime);
  });
});

Живая копия

Вывод:

Loading JSON from /aduji4...
Data received, ArrayOfBusyDateTime.length = 2
Entry 0: Start = 2011-04-20T10:00:00, end = 2011-04-20T10:30:00
Entry 1: Start = 2011-04-20T12:00:00, end = 2011-04-20T13:00:00

XML

Для полноты, если ваши данные действительно являются XML, напримерэто:

<ArrayOfBusyDateTime xmlns="http://schemas.datacontract.org/2004/07/RestServiceTest" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <BusyDateTime>
    <busyEndTime>2011-04-20T10:30:00</busyEndTime>
    <busyStartTime>2011-04-20T10:00:00</busyStartTime>
    <endGradient>0</endGradient>
    <startGradient>0</startGradient>
    <status>busy</status>
  </BusyDateTime>
  <BusyDateTime>
    <busyEndTime>2011-04-20T13:00:00</busyEndTime>
    <busyStartTime>2011-04-20T12:00:00</busyStartTime>
    <endGradient>0</endGradient>
    <startGradient>0</startGradient>
    <status>busy</status>
  </BusyDateTime>
</ArrayOfBusyDateTime>

Работа с данными XML:

... тогда вот как вы можете с этим работать:

$.ajax({
  url: url,
  dataType: "xml",
  success: function(data) {
    // jQuery will deserialize it for us, so our
    // `data` is now an XML document. Wrap a jQuery
    // instance around it to make it easy to work with.
    data = $(data);

    // Show how many entries we got in the array
    var busyDateTimes = data.find("BusyDateTime");
    display("Data received, ArrayOfBusyDateTime length = " +
            busyDateTimes.length);

    // Show the start and end times of each entry
    busyDateTimes.each(function(index) {
      // In this loop, `this` will be the raw XML
      // element; again wrap a jQuery object around
      // it for convenience
      var $this = $(this);
      display("Entry " + index +
              ": Start = " + $this.find("busyStartTime").text() +
              ", end = " + $this.find("busyEndTime").text());
    });
  },
  error: function() {
    display("Error loading XML");
  }
});

Live copy

... хотя я не слишком много работаю с XML, можно добиться некоторой эффективности (кажется, что в экземплярах jQuery нужно много оборачиваться).

Вывод:

Loading JSON from /aduji4/2...
Data received, ArrayOfBusyDateTime length = 2
Entry 0: Start = 2011-04-20T10:00:00, end = 2011-04-20T10:30:00
Entry 1: Start = 2011-04-20T12:00:00, end = 2011-04-20T13:00:00
1 голос
/ 22 апреля 2011

Это не похоже на JSON для меня! Похоже на XML.

JSON невероятно прост и задокументирован здесь: http://www.json.org/

То, что вы могли обнаружить, может стать причиной потери интереса к WCF, но не к JSON / javascript / jQuery.

...