Переменная json в javascript zendesk - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь получить количество открытых билетов из API Zendesk для конкретного пользователя. Однако я не могу заставить его работать. Я получаю эту ошибку:

Uncaught TypeError: Cannot read property '500' of undefined

Формат json:

{
"user": {
    "id": 500,
    "url": "https://zendesk/api/v2/users/500.json",
    "name": "Random name",
    "email": "not important",
    "created_at": "2016-05-18T15:26:43Z",
    "updated_at": "2018-07-04T06:23:35Z",
    "time_zone": "Brussels",
    "phone": null,
    "shared_phone_number": null,
    "photo": {
        "url": "https://google.com",
        "id": 504,
        "file_name": "keep-calm-and-shut-up-im-your-system-administrator.png",
        "content_url": "https://google.com",
        "mapped_content_url": "https://google.com",
        "content_type": "image/png",
        "size": 3298,
        "width": 80,
        "height": 50,
        "inline": false,
        "thumbnails": [
            {
                "url": "https://google.com",
                "id": 90752965,
                "file_name": "not important",
                "content_url": "https://google.com",
                "mapped_content_url": "https://google.com",
                "content_type": "image/png",
                "size": 3298,
                "width": 32,
                "height": 20,
                "inline": false
            }
        ]
    },
    "locale_id": 1005,
    "locale": "nl",
    "organization_id": 501,
    "role": "admin",
    "verified": true,
    "external_id": null,
    "tags": [],
    "alias": "",
    "active": true,
    "shared": false,
    "shared_agent": false,
    "last_login_at": "2018-07-04T06:23:35Z",
    "two_factor_auth_enabled": null,
    "signature": "",
    "details": "",
    "notes": "",
    "role_type": null,
    "custom_role_id": null,
    "moderator": true,
    "ticket_restriction": null,
    "only_private_comments": false,
    "restricted_agent": false,
    "suspended": false,
    "chat_only": false,
    "default_group_id": 503,
    "user_fields": {
        "agent_ooo": false
    }
},
"open_ticket_count": {
    "500": 15
}}

Это мой код JavaScript:

        <script>
    function getJSON(url) {
    var resp ;
    var xmlHttp ;

    resp  = '' ;
    xmlHttp = new XMLHttpRequest();

    if(xmlHttp != null)
    {
        xmlHttp.open( "GET", url, false );
        xmlHttp.send( null );
        resp = xmlHttp.responseText;
    }

    return resp ;
}
   var gjson ;
    gjson = getJSON('https://zendesk.com//api/v2/users/me.json? 
    include=open_ticket_count');

console.log(gjson.open_ticket_count["500"]);

</script>

Может ли кто-нибудь мне помочь? Я не уверен, что я делаю неправильно (URL-адреса zendesk - это правильные URL-адреса в реальном скрипте, и они могут получить к нему доступ)

TLDR: мне нужно извлечь переменную из: open_ticket_count из json.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Вам необходимо проанализировать JSON, чтобы получить к нему доступ. Используйте код ниже

<script>
    function getJSON(url) {
       var resp ;
       var xmlHttp ;

       resp  = '' ;
       xmlHttp = new XMLHttpRequest();

       if(xmlHttp != null)
       {
           xmlHttp.open( "GET", url, false );
           xmlHttp.send( null );
           resp = xmlHttp.responseText;
       }

       return resp ;
    }

    var gjson ;
    gjson = getJSON('https://zendesk.com//api/v2/users/me.json? 
    include=open_ticket_count');

    gjson = JSON.parse(gjson)

    console.log(gjson.open_ticket_count["500"]);

</script>
0 голосов
/ 04 июля 2018

Ваша функция getJSON не будет ждать, пока запрос фактически пройдет. Такая функция вернет responseText только после завершения:

const getJSON = function(url, callback) {
    let xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'json';
    xhr.onload = function() {
      let status = xhr.status;
      if (status === 200) {
        callback(null, xhr.response);
      } else {
        callback(status, xhr.response);
      }
    };
    xhr.send();
};

Затем вы можете использовать это для получения Zendesk JSON:

getJSON('https://zendesk.com//api/v2/users/me.json?include=open_ticket_count', (status, gjson) => {
    console.log(gjson.open_ticket_count["500"]);
});
0 голосов
/ 04 июля 2018

Подсказка в ошибке

Uncaught TypeError: Невозможно прочитать свойство '500' из неопределенного

Что говорит о том, что gjson.open_ticket_count не определено.

Вы фактически не анализировали JSON и пытались получить свойство строки, а не проанализированного JSON.

Попробуйте сначала разобрать его.

var gjson;
gjson = getJSON('https://zendesk.com//api/v2/users/me.json?include=open_ticket_count');
var gobj = JSON.parse(gjson);
console.log(gobj.open_ticket_count["500"]);
0 голосов
/ 04 июля 2018

Трудно сказать точно без остальной среды, но я предполагаю, что это будет работать:

    var gjson ;
    gjson = getJSON('https://zendesk.com//api/v2/users/me.json?include=open_ticket_count'');
    var jsonObj = JSON.parse(gjson); // assuming getJSON returns the json as string, this is async, make sure next row has the data needed on time or rewqork this as promise
    console.log(jsonObj.open_ticket_count["500"]);

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

...