JavaScript и JSON, как парсить?

Итак, у меня большие проблемы с созданием приложения, которое работает с Zendesk. По сути, мне нужно найти все билеты в базе данных и подсчитать их количество для каждого конечного пользователя. Конечный пользователь — это текстовое поле в каждом билете.

Итак, вот где я:

«/api/v2/tickets.json» — это список всех билетов в формате JSON — он помещается в переменную «tickets», которую я использую после — я думал, что «tickets» будет массивом, но теперь я этого не делаю. не думаю, что это так, так как же можно пройти через это?

СЕЙЧАС - как я могу получить доступ к значениям в этом файле билетов? Например, как я могу получить доступ к значению «Конечный пользователь» с помощью JavaScript?

Я просмотрел документацию Zendesk по их API и не могу найти ничего полезного для того, чтобы заставить его работать, а их форумы несколько мертвы. Надеюсь, вы, ребята, сможете мне помочь, так как я новичок в JavaScript.

Хорошо, вот пример записи JSON:

{"tickets":[{"url":"https://company.zendesk.com/api/v2/tickets/1.json","id":1,"external_id":null,"via":{"channel":"web","source":{"from":{},"to":{},"rel":null}},"created_at":"2012-10-01T16:06:33Z","updated_at":"2012-10-05T19:21:55Z","type":"incident","subject":"This is a sample ticket requested and submitted by you","description":"This is the first comment. Feel free to delete this sample ticket.","priority":"high","status":"closed","recipient":null,"requester_id":270249903,"submitter_id":270249903,"assignee_id":270249903,"organization_id":22242373,"group_id":20363013,"collaborator_ids":[],"forum_topic_id":null,"problem_id":null,"has_incidents":false,"due_at":null,"tags":["sample","zendesk"],"fields":[{"id":21717236,"value":"10/4/2012"}],"custom_fields":[{"id":21717236,"value":"10/4/2012"}],"satisfaction_rating":null},{"url":"https://company.zendesk.com/api/v2/tickets/2.json","id":2,"external_id":null,"via":{"channel":"email","source":{"from":{"address":"[email protected]","name":"Zendesk"},"to":{"address":"[email protected]","name":"Binary Stream Helpdesk"},"rel":null}},"created_at":"2012-10-01T16:33:58Z","updated_at":"2012-10-05T17:09:37Z","type":null,"subject":"Tudor Hofnar, here is the test ticket you requested","description":"        Hello! This is a Zendesk ticket. We are going to go through the basic support ticket operation in Zendesk.\n\n        If you are in your email reading this, please click on the link in the header that starts with Ticket #.\n\n        If you are in your Zendesk reading this, you will see the ticket number, the customer who sent this ticket in, and drop down menus that allow you to set things like status and priority. You'll also notice a blank text box below this comment. That is for you to respond. Let's do that:\n\n        1. Write: \"Thanks for this information, please tell me more.\"\n        2. Change the drop-down field labeled Status to \"Pending\"\n\n        If you follow these instructions, you'll get an email response back from us shortly.  You can also always see ticket updates by going back into your unsolved ticket view (click view in the top menu bar).\n","priority":null,"status":"closed","recipient":null,"requester_id":270263553,"submitter_id":270263553,"assignee_id":270249903,"organization_id":null,"group_id":20363013,"collaborator_ids":[],"forum_topic_id":null,"problem_id":null,"has_incidents":false,"due_at":null,"tags":[],"fields":[{"id":21717236,"value":"10/4/2012"}],"custom_fields":[{"id":21717236,"value":"10/4/2012"}],"satisfaction_rating":null},{"url":"https://company.zendesk.com/api/v2/tickets/3.json","id":3,"external_id":null,"via":{"channel":"email","source":{"from":{"address":"[email protected]","name":"Tudor Hofnar"},"to":{"address":"[email protected]","name":"Binary Stream Helpdesk"},"rel":null}},"created_at":"2012-10-01T17:08:37Z","updated_at":"2012-10-05T18:15:01Z","type":null,"subject":"test","description":"test\n\nTudor Hofnar","priority":null,"status":"closed","recipient":"[email protected]","requester_id":270249903,"submitter_id":270249903,"assignee_id":270249903,"organization_id":22242373,"group_id":20363013,"collaborator_ids":[],"forum_topic_id":null,"problem_id":null,"has_incidents":false,"due_at":null,"tags":[],"fields":[{"id":21717236,"value":"10/4/2012"}],"custom_fields":[{"id":21717236,"value":"10/4/2012"}],"satisfaction_rating":null},{"url":"https://company.zendesk.com/api/v2/tickets/5.json","id":5,"external_id":null,"via":{"channel":"web","source":{"from":{},"to":{},"rel":null}},"created_at":"2012-10-01T20:26:34Z","updated_at":"2012-10-06T22:39:09Z","type":"incident","subject":"Window for adding account not opening","description":"The add account window is not opening and it is causing a lot of trouble for our team etc....","priority":"normal","status":"closed","recipient":null,"requester_id":271853958,"submitter_id":271853958,"assignee_id":270249903,"organization_id":22284363,"group_id":20363013,"collaborator_ids":[],"forum_topic_id":null,"problem_id":null,"has_incidents":false,"due_at":null,"tags":["2
(function() {

  return {
    // Here we define AJAX calls
    requests: {
      fetchTickets: function() {
        return {
          url: '/api/v2/tickets.json',
          type: 'GET'
        };
      }
    },
    // Here we define events such as a user clicking on something
    events: {
      'app.activated': 'requestTickets',

      'fetchTickets.always': function(data) {
        this.countEndUserTickets((data || {}).tickets);
      }
    },
    // Below this point, you're free to define your own functions used by the app   
    requestTickets: function() {
      this.ajax('fetchTickets');
    },

    countEndUserTickets: function(tickets) {
      var endUser = this.ticket().customField("End-User"); //this will get the end-user of the current ticket that is open in Zendesk
      var ticketCounter = 0;

      //this is where I have no idea how to access the 'tickets' array or whatever it is
      for (var i = 0; i <= tickets.length; i++) {
        if (tickets[i].customField("End-User") == endUser){
          ticketCounter = ticketCounter + 1;
        }
      }

      alert(endUser);

      this.switchTo('list', {
        ticketCounter: this.ticketCounter
      });
    }
  };  
}());
2","4","ared","end_user_1","var_2"],"fields":[{"id":21704983,"value":"1"},{"id":21708732,"value":"tried this"},{"id":21708742,"value":"1"},{"id":21713331,"value":"10/2/2012"},{"id":21717086,"value":"ared"},{"id":21717236,"value":"10/4/2012"},{"id":21717357,"value":"2
(function() {

  return {
    // Here we define AJAX calls
    requests: {
      fetchTickets: function() {
        return {
          url: '/api/v2/tickets.json',
          type: 'GET'
        };
      }
    },
    // Here we define events such as a user clicking on something
    events: {
      'app.activated': 'requestTickets',

      'fetchTickets.always': function(data) {
        this.countEndUserTickets((data || {}).tickets);
      }
    },
    // Below this point, you're free to define your own functions used by the app   
    requestTickets: function() {
      this.ajax('fetchTickets');
    },

    countEndUserTickets: function(tickets) {
      var endUser = this.ticket().customField("End-User"); //this will get the end-user of the current ticket that is open in Zendesk
      var ticketCounter = 0;

      //this is where I have no idea how to access the 'tickets' array or whatever it is
      for (var i = 0; i <= tickets.length; i++) {
        if (tickets[i].customField("End-User") == endUser){
          ticketCounter = ticketCounter + 1;
        }
      }

      alert(endUser);

      this.switchTo('list', {
        ticketCounter: this.ticketCounter
      });
    }
  };  
}());
2"}],"custom_fields":[{"id":21704983,"value":"1"},{"id":21708732,"value":"tried this"},{"id":21708742,"value":"1"},{"id":21713331,"value":"10/2/2012"},{"id":21717086,"value":"ared"},{"id":21717236,"value":"10/4/2012"},{"id":21717357,"value":"2
(function() {

  return {
    // Here we define AJAX calls
    requests: {
      fetchTickets: function() {
        return {
          url: '/api/v2/tickets.json',
          type: 'GET'
        };
      }
    },
    // Here we define events such as a user clicking on something
    events: {
      'app.activated': 'requestTickets',

      'fetchTickets.always': function(data) {
        this.countEndUserTickets((data || {}).tickets);
      }
    },
    // Below this point, you're free to define your own functions used by the app   
    requestTickets: function() {
      this.ajax('fetchTickets');
    },

    countEndUserTickets: function(tickets) {
      var endUser = this.ticket().customField("End-User"); //this will get the end-user of the current ticket that is open in Zendesk
      var ticketCounter = 0;

      //this is where I have no idea how to access the 'tickets' array or whatever it is
      for (var i = 0; i <= tickets.length; i++) {
        if (tickets[i].customField("End-User") == endUser){
          ticketCounter = ticketCounter + 1;
        }
      }

      alert(endUser);

      this.switchTo('list', {
        ticketCounter: this.ticketCounter
      });
    }
  };  
}());
2"}],"satisfaction_rating":null},{"url":"https://company.zendesk.com/api/v2/tickets/6.json","id":6,"external_id":null,"via":{"channel":"web","source":{"from":{},"to":{},"rel":null}},"created_at":"2012-10-02T21:14:59Z","updated_at":"2012-10-09T18:22:04Z","type":"incident","subject":"Test Ticket","description":"this is a test ticket","priority":"normal","status":"closed","recipient":null,"requester_id":271853958,"submitter_id":271853958,"assignee_id":270249903,"organization_id":22284363,"group_id":20363013,"collaborator_ids":[],"forum_topic_id":null,"problem_id":null,"has_incidents":false,"due_at":null,"tags":["2
(function() {

  return {
    // Here we define AJAX calls
    requests: {
      fetchTickets: function() {
        return {
          url: '/api/v2/tickets.json',
          type: 'GET'
        };
      }
    },
    // Here we define events such as a user clicking on something
    events: {
      'app.activated': 'requestTickets',

      'fetchTickets.always': function(data) {
        this.countEndUserTickets((data || {}).tickets);
      }
    },
    // Below this point, you're free to define your own functions used by the app   
    requestTickets: function() {
      this.ajax('fetchTickets');
    },

    countEndUserTickets: function(tickets) {
      var endUser = this.ticket().customField("End-User"); //this will get the end-user of the current ticket that is open in Zendesk
      var ticketCounter = 0;

      //this is where I have no idea how to access the 'tickets' array or whatever it is
      for (var i = 0; i <= tickets.length; i++) {
        if (tickets[i].customField("End-User") == endUser){
          ticketCounter = ticketCounter + 1;
        }
      }

      alert(endUser);

      this.switchTo('list', {
        ticketCounter: this.ticketCounter
      });
    }
  };  
}());
2","arcb","end_user_1","var_2"],"fields":[{"id":21704983,"value":"1"},{"id":21708732,"value":"tried this"},{"id":21708742,"value":"1"},{"id":21713331,"value":"10/2/2012"},{"id":21717086,"value":"arcb"},{"id":21717236,"value":"10/2/2012"},{"id":21717357,"value":""},{"id":21728942,"value":null},{"id":21732321,"value":"Test End-User"}],"custom_fields":[{"id":21704983,"value":"1"},{"id":21708732,"value":"tried this"},{"id":21708742,"value":"1"},{"id":21713331,"value":"10/2/2012"},{"id":21717086,"value":"arcb"},{"id":21717236,"value":"10/2/2012"},{"id":21717357,"value":""},{"id":21728942,"value":null},{"id":21732321,"value":"Test End-User"}],"satisfaction_rating":null},{"url":"https://company.zendesk.com/api/v2/tickets/7.json","id":7,"external_id":null,"via":{"channel":"web","source":{"from":{},"to":{},"rel":null}},"created_at":"2012-10-09T20:09:50Z","updated_at":"2012-10-11T18:19:42Z","type":"question","subject":"Testing bookmarks","description":"this is a bookmark test\n","priority":"normal","status":"open","recipient":null,"requester_id":270249903,"submitter_id":270249903,"assignee_id":270249903,"organization_id":22242373,"group_id":20363013,"collaborator_ids":[],"forum_topic_id":null,"problem_id":null,"has_incidents":false,"due_at":null,"tags":["2010","psm"],"fields":[{"id":21704983,"value":"0"},{"id":21708732,"value":null},{"id":21708742,"value":"1"},{"id":21713331,"value":"10/9/2012"},{"id":21717086,"value":"psm"},{"id":21717236,"value":"10/31/2012"},{"id":21717357,"value":"2010"},{"id":21728942,"value":"Var 1"},{"id":21732321,"value":"End User 2"}],"custom_fields":[{"id":21704983,"value":"0"},{"id":21708732,"value":null},{"id":21708742,"value":"1"},{"id":21713331,"value":"10/9/2012"},{"id":21717086,"value":"psm"},{"id":21717236,"value":"10/31/2012"},{"id":21717357,"value":"2010"},{"id":21728942,"value":"Var 1"},{"id":21732321,"value":"End User 2"}],"satisfaction_rating":null}],"next_page":null,"previous_page":null,"count":6}

не знаю, как форматировать этот код...

Теперь это мой код JS, я знаю, что это неправильно, что я пытаюсь сделать с «тикетами», но я понятия не имею, как получить к нему доступ...

(function() {

  return {
    // Here we define AJAX calls
    requests: {
      fetchTickets: function() {
        return {
          url: '/api/v2/tickets.json',
          type: 'GET'
        };
      }
    },
    // Here we define events such as a user clicking on something
    events: {
      'app.activated': 'requestTickets',

      'fetchTickets.always': function(data) {
        this.countEndUserTickets((data || {}).tickets);
      }
    },
    // Below this point, you're free to define your own functions used by the app   
    requestTickets: function() {
      this.ajax('fetchTickets');
    },

    countEndUserTickets: function(tickets) {
      var endUser = this.ticket().customField("End-User"); //this will get the end-user of the current ticket that is open in Zendesk
      var ticketCounter = 0;

      //this is where I have no idea how to access the 'tickets' array or whatever it is
      for (var i = 0; i <= tickets.length; i++) {
        if (tickets[i].customField("End-User") == endUser){
          ticketCounter = ticketCounter + 1;
        }
      }

      alert(endUser);

      this.switchTo('list', {
        ticketCounter: this.ticketCounter
      });
    }
  };  
}());

person Tudor Hofnar    schedule 11.10.2012    source источник
comment
Я думал, что "tickets" будет массивом, но теперь я так не думаю Как выглядит json для ответа, который дает вам несколько билетов?   -  person Alex Wayne    schedule 11.10.2012
comment
В предоставленном вами JSON какое поле вы пытаетесь получить?   -  person Gabriel Florit    schedule 11.10.2012
comment
Я пытаюсь получить поле «Конечный пользователь», которое является настраиваемым полем... кажется, что у Zendesk нет фактического имени в JSON, только идентификатор, который равен 21732321.   -  person Tudor Hofnar    schedule 12.10.2012
comment
jsfiddle.net/tepbd/1 возвращается в консоль (нажмите F12 в Chrome, чтобы увидеть) журнал выведите объект, который включает это поле. Я пока не могу заставить работать getJSON(), упомянутый ниже. @Габирель Флорит   -  person Xitalogy    schedule 12.10.2012


Ответы (6)


Согласно их документации, Zendesk поддерживает JSONP:

вы можете указать обратный вызов, добавив «?callback=your_call_back_function» к URL-адресу GET

Таким образом, вы можете изменить свой URL-адрес на '/api/v2/tickets.json?callback=fetchTicketsCallback', и будет вызываться fetchTicketsCallback, передавая полностью проанализированный объект JavaScript.

Изменить: На самом деле, согласно этой документации (которая выглядит ужасно похоже на опубликованный вами код), обработчики Zendesk ajax получают полностью проанализированные объекты JavaScript, а не необработанные строки JSON. Таким образом, не должно быть никаких причин для изменения URL-адреса. Просто получите доступ к членам через стандартную нотацию с точкой или квадратными скобками. Итак, чтобы получить значение поля с id из 21732321:

ticket.fields.filter(function(field) {
    return field.id == 21732321;
})[0].value;

Похоже, вы хотите:

function countTickets(user) {
    var count = 0;
    response.tickets.forEach(function(ticket) {
        var filteredFields = ticket.fields.filter(function(field) {
            return field.id == 21732321;
        });
        if (filteredFields.length > 0 && filteredFields[0].value == user) {
            count++;
        }
    });
    return count;
}

http://jsfiddle.net/azRJM/

person gilly3    schedule 11.10.2012
comment
Хорошо, так как это полностью проанализированный объект JavaScript, как я могу проиндексировать конкретный билет в файле JSON. Скажем, есть 10 билетов, и я хочу 6-й. Я бы сделал это, используя билеты [6] на другом языке программирования, но как это работает с JSON? - person Tudor Hofnar; 12.10.2012
comment
@TudorHofnar - это не JSON, это JavaScript. JSON — это формат сериализации данных, который всегда является строкой. У вас есть объект JavaScript (возможно, десериализованный из JSON). В JavaScript, чтобы получить элемент массива, вы используете нотацию с квадратными скобками, передавая индекс нужного элемента. Например, для 6-го элемента: tickets[5] (индексы JavaScript отсчитываются от 0, поэтому 6-й элемент имеет индекс 5). - person gilly3; 12.10.2012
comment
Я попытался сделать что-то вроде этого var test = ticket[4].status(); чтобы получить статус 5-го билета, и мне ничего не возвращается... Я что-то упустил? - person Tudor Hofnar; 12.10.2012
comment
@TudorHofnar - использование скобок указывает на то, что вы вызываете метод. Объекты JavaScript, проанализированные из JSON, никогда не содержат методов (если они не расширяются после анализа). Опустите круглые скобки для доступа к значению свойства. - person gilly3; 12.10.2012
comment
О да! Плохо, я использовал круглые скобки, потому что есть другой способ получить статус, но это для текущего открытого билета, такого как этот var status = this.ticket().status(); так я сам запутался! Спасибо! сейчас постараюсь все сделать - person Tudor Hofnar; 12.10.2012
comment
Я только что увидел ваш отредактированный пост выше ... и я пытаюсь понять это. Итак, допустим, я знаю конечного пользователя, для которого мне нужно увидеть количество билетов, а затем все, что мне нужно, это выполнить поиск в JSON, чтобы узнать, сколько билетов принадлежит этому пользователю. Например, есть текстовое поле, и я ввожу «Конечный пользователь 1», затем этот метод запускается и возвращает количество билетов «Конечный пользователь 1». Я пытаюсь понять ваш метод, но меня смущает var userField... также [0] в конце этого утверждения. - person Tudor Hofnar; 12.10.2012
comment
Также я, кажется, не могу использовать ticket.fields.filter, выдается ошибка, потому что я использую «билет», «билет» не определен. Это из Зендеска. - person Tudor Hofnar; 12.10.2012
comment
Хорошо, я понял, билет должен быть билетом [i], где я — индекс. Но так как вы используете foreach, у меня нет index. Должен ли я просто создать еще одну переменную для использования в операторе foreach и увеличить ее? - person Tudor Hofnar; 12.10.2012
comment
@TudorHofnar - Все, что я могу сделать, это предположить, потому что опубликованный вами образец JSON не содержит членов, о которых вы говорите, таких как tickets. Можете ли вы обновить JSON в своем вопросе, чтобы он был более полным? - person gilly3; 12.10.2012
comment
@TudorHofnar - я обновил свой ответ некоторыми комментариями в коде, которые должны помочь прояснить, что там происходит. - person gilly3; 12.10.2012
comment
Хорошо, я вставил весь свой JSON, в нем 6 тикетов. Извините за форматирование, но это то, с чем я работаю, чтобы попытаться подсчитать количество билетов/конечных пользователей. Я не хочу получать данные обо всех конечных пользователях одновременно. Я просто хочу один, например, жестко запрограммированный, например, Конечный пользователь 1. - person Tudor Hofnar; 12.10.2012
comment
@TudorHofnar. Я обновил свой пример и опубликовал демонстрацию на основе предоставленного вами ответа. - person gilly3; 12.10.2012
comment
Спасибо!!! Это имеет смысл, и он отлично работает в jsFiddle, но я не могу заставить это работать в моем приложении. Пока я просто пытаюсь использовать предупреждение, чтобы убедиться, что возвращаемое значение является правильным. Я попробовал значение в jsFiddle, и теперь оно возвращает 1 (тестовый конечный пользователь) в моем приложении, окно сообщения не появляется... вот как я создаю его alert(count); Это верно? - person Tudor Hofnar; 12.10.2012
comment
Кроме того, поскольку мой «ответ» поступает в виде «билетов», я могу просто удалить «ответ» из первой строки? Я пробовал делать ticket.tickets.forEach, но это тоже не сработало. Tickets.tickets имеет смысл, поскольку мои билеты равны вашему ответу... но я все еще не могу получить какие-либо значения в предупреждении. - person Tudor Hofnar; 12.10.2012
comment
Неважно! У меня все заработало, проблема с моей стороны с оповещением! Большое вам спасибо за помощь!!!! - person Tudor Hofnar; 12.10.2012

jQuery упрощает работу с jQuery.parseJSON Вот простой пример: http://api.jquery.com/jQuery.parseJSON/

person Tom G    schedule 11.10.2012
comment
Почему вы не можете просто установить правильно сформированный объект JSON в var. Разве это не приводит к объекту с ключами: значения? Я попробовал это в jsfiddle в Chrome, и это сработало - есть ли какая-то проблема с кросс-браузерной совместимостью? Вот мой jsfiddle: jsfiddle.net/tepbd - person Xitalogy; 12.10.2012

Попробуй это:

var json = '{ "url":"https://test.zendesk.com/api/v2/tickets/6.json", "id":6, "external_id":null, "via":{ "channel":"web", "source":{ "from":{}, "to":{}, "rel":null } }, "created_at":"2012-10-02T21:14:59Z", "updated_at":"2012-10-09T18:22:04Z", "type":"incident", "subject":"Test Ticket", "description":"this is a test ticket", "priority":"normal", "status":"closed", "recipient":null, "requester_id":271853958, "submitter_id":271853958, "assignee_id":270249903, "organization_id":22284363, "group_id":20363013, "collaborator_ids":[], "forum_topic_id":null, "problem_id":null, "has_incidents":false, "due_at":null, "tags":["2_2_2","arcb","end_user_1","var_2"], "fields":[ {"id":21704983,"value":"1"}, {"id":21708732,"value":"tried this"}, {"id":21708742,"value":"1"}, {"id":21713331,"value":"10/2/2012"}, {"id":21717086,"value":"arcb"}, {"id":21717236,"value":"10/2/2012"}, {"id":21717357,"value":""}, {"id":21728942,"value":null}, {"id":21732321,"value":"Test End-User"}], "custom_fields":[{"id":21704983,"value":"1"}, {"id":21708732,"value":"tried this"}, {"id":21708742,"value":"1"}, {"id":21713331,"value":"10/2/2012"}, {"id":21717086,"value":"arcb"}, {"id":21717236,"value":"10/2/2012"}, {"id":21717357,"value":""}, {"id":21728942,"value":null}, {"id":21732321,"value":"Test End-User"}], "satisfaction_rating":null }';

var obj = JSON.parse(json);
$('body').append('<div>Tags value: ' + obj.tags + '</div><br>');
var len = obj.custom_fields.length;

for(n = 0; n < len; n++)
{
    $('body').append('<div>Custom field value: ' + obj.custom_fields[n].value + '</div>');
}

Посмотрите это в действии: http://jsfiddle.net/7nbpq/5/

person Justin    schedule 11.10.2012
comment
Хорошо, я попробую... но "билеты" содержат разные отдельные билеты... так что код JSON, который я опубликовал... это только один билет. Как указать, с каким билетом в этом объекте я хочу иметь дело? В основном я спрашиваю, как сделать массив [2] для объекта JSON - person Tudor Hofnar; 12.10.2012
comment
Вам придется перебрать его, как я делаю в своем ответе, за исключением того, что вместо этого просто используйте var len = obj.length; а затем в вашем цикле obj[n].tags или что-то еще, к чему вы хотите получить доступ. - person Justin; 12.10.2012
comment
Я попробовал это jsfiddle.net/7nbpq/5 (спасибо за ссылку на jsfiddle, я никогда не слышал о это раньше, но это должно облегчить тестирование :)) Но он ничего не отображает. По сути, я просто хотел посмотреть, какова длина всего объекта, в нем 6 билетов, поэтому я хотел бы увидеть возвращаемое значение 6, но я ничего не получаю... - person Tudor Hofnar; 12.10.2012
comment
Да, я забыл, что объект не будет работать с длиной. Вместо этого попробуйте следующее: jsfiddle.net/7nbpq/10. - person Justin; 12.10.2012
comment
Хорошо, это выглядит хорошо, но как насчет того, когда есть еще один уровень ... так что несколько билетов в билетах?? Таким образом, фактический JSON в этом случае выглядит следующим образом: jsfiddle.net/7nbpq/5 - person Tudor Hofnar; 12.10.2012

Попробуйте использовать json_encode() для возврата на стороне сервера и/или jQuery.parseJSON() для приема данных на стороне клиента. Это должно позволить вам получить данные в массиве, который очень поможет.

person Austin Munro    schedule 11.10.2012

Прежде всего, вам следует использовать $.getJSON — это сокращение для функции $.ajax, специально для получения JSON:

$.getJSON('myfile.json', function(json) {

    // do something with json here 
});

Во-вторых, когда у вас есть json, вы можете получить к нему доступ с помощью точечных операторов — его не нужно анализировать, поскольку он уже является объектом.

person Gabriel Florit    schedule 11.10.2012
comment
Если это так, то это не имеет ничего общего с $.getJSON — это сокращение от $.ajax. С какими именно проблемами вы сталкиваетесь? - person Gabriel Florit; 12.10.2012
comment
Пожалуйста, перейдите по ссылке выше, чтобы попробовать это, или здесь: sanbarcomputing.com/flat/ forumPosts/getJSON/getJSON.html Спасибо. Я получаю следующую ошибку в консоли Chrome: Uncaught SyntaxError: Unexpected token : у меня была эта проблема раньше, и, кажется, я помню, что она интерпретирует ее как код JavaScript. - person Xitalogy; 12.10.2012
comment
Кажется, это проблема JSON и JSONP. - person Xitalogy; 12.10.2012

Это может помочь вам с поиском JSON и доступом к результирующему объекту.

Попробуйте здесь Посмотреть вывод console.log() с помощью консоли (нажмите F12 в Chrome или используйте FireBug в FireFox и т. д.):

JavaScript:

$(document).ready(function () {
    "use strict";
    $.getJSON("getJSON.json", function (data) {
        $("#look").on('click', function () {
            var $output = $("#output");
            var index, id = $("#input").val();
            var filtered = data.custom_fields.filter(function (element) {
                return element.id.toString() == id;
            });
            $output.empty();
            for (index in filtered) {
                $output.append("Value: " + filtered[index].value);
            }
            console.log(filtered);
        });
        console.log(data);
    });
});

HTML:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
</head>
<body>
    Pleased input a custom field ID:  <input id="input" type="text" value="21732321" />
    <button id="look">Look Up By ID</button>
    <p id="output"></p>
<script type="text/javascript" src="getJSON.js"></script>
</body>
</html>

JSON (это ваш JSON, проверенный и отформатированный здесь):

{
    "url": "https://test.zendesk.com/api/v2/tickets/6.json",
    "id": 6,
    "external_id": null,
    "via": {
        "channel": "web",
        "source": {
            "from": {},
            "to": {},
            "rel": null
        }
    },
    "created_at": "2012-10-02T21:14:59Z",
    "updated_at": "2012-10-09T18:22:04Z",
    "type": "incident",
    "subject": "Test Ticket",
    "description": "this is a test ticket",
    "priority": "normal",
    "status": "closed",
    "recipient": null,
    "requester_id": 271853958,
    "submitter_id": 271853958,
    "assignee_id": 270249903,
    "organization_id": 22284363,
    "group_id": 20363013,
    "collaborator_ids": [],
    "forum_topic_id": null,
    "problem_id": null,
    "has_incidents": false,
    "due_at": null,
    "tags": [
        "2_2_2",
        "arcb",
        "end_user_1",
        "var_2"
    ],
    "fields": [
        {
            "id": 21704983,
            "value": "1"
        },
        {
            "id": 21708732,
            "value": "tried this"
        },
        {
            "id": 21708742,
            "value": "1"
        },
        {
            "id": 21713331,
            "value": "10/2/2012"
        },
        {
            "id": 21717086,
            "value": "arcb"
        },
        {
            "id": 21717236,
            "value": "10/2/2012"
        },
        {
            "id": 21717357,
            "value": ""
        },
        {
            "id": 21728942,
            "value": null
        },
        {
            "id": 21732321,
            "value": "Test End-User"
        }
    ],
    "custom_fields": [
        {
            "id": 21704983,
            "value": "1"
        },
        {
            "id": 21708732,
            "value": "tried this"
        },
        {
            "id": 21708742,
            "value": "1"
        },
        {
            "id": 21713331,
            "value": "10/2/2012"
        },
        {
            "id": 21717086,
            "value": "arcb"
        },
        {
            "id": 21717236,
            "value": "10/2/2012"
        },
        {
            "id": 21717357,
            "value": ""
        },
        {
            "id": 21728942,
            "value": null
        },
        {
            "id": 21732321,
            "value": "Test End-User"
        }
    ],
    "satisfaction_rating": null
}
person Xitalogy    schedule 18.10.2012