Как обрабатывать разделенные запятыми объекты в JSON? ([объект объекта], [объект объекта]) - PullRequest
0 голосов
/ 16 апреля 2011

Я новичок в этом, поэтому, пожалуйста, потерпите меня.Я имею дело с API-интерфейсом Twitter, который в значительной степени опирается на JSON (и это неплохо).

Что-то, что делает Twitter, возвращает некоторые значения в виде объектов, разделенных запятыми.Это похоже на раздел [entity], который перечисляет ссылки в твите.

Это функция, которую я использую для преобразования json в неупорядоченные списки.Раздел, закомментированный из этого кода, - вот что мне нужно для помощи.

function buildULfromJSON(data){
  var items = [];

  function recurse(json){                               //declare recursion function
    items.push('<ul>');                                 // start a new <ul>

    $.each(json, function(key, val) {                   // iterate through json and test, treat vals accordingly

      if((val == '[object Object]') && (typeof val == 'object')){ // this catches nested json lists
        items.push('<li>[' + key + '] =></li>');                  // adds '[key] =>'
        recurse(val);                                             // calls recurse() to add a nested <ul>

      }else if(typeof(val)=='string'){                            // catch string values
        items.push('<li>[' + key + '] = \"' + val + '\"</li>');   // add double quotes to <li> item

      }/* else if(typeof(val) == 'object'){                      // this throws exception in jquery.js
        $.each(val, function(){                                  // when val contains [object Object],[object Object]
          items.push('<li>[' + key + '] =></li>');               // need to test for and process 
          recurse(val);                                          // comma seperated objects
        });
      } */else{
        items.push('<li>[' + key + '] = ' + val + '</li>');     // non string, non object data (null, true, 123, .etc)
      }

    });
    items.push('</ul>');                             // close </ul>
  }                                                  // end recursion function


  recurse(data);            // call recursion
  return items.join('');    // return results
}  // end buildULfromJSON()

Вот фрагмент примера вывода, где твит содержит один хэштег, два упоминания пользователя и три URL-адреса.Эти элементы возвращаются в виде списка объектов, разделенных запятыми (данные json).Я в полной растерянности, как справиться с этим.Любое направление, которое вы, ребята, могли бы предоставить, было бы превосходным.

Обратите внимание на строку [text].Помогает поместить секцию [entity] в контекст.

<snippet>
[text] = "#Hashtag @PithyTwits @LuvsIt2 http://link1.com http://link2.com http://link3.com"
[retweet_count] = 0
[entities] =>
    [hashtags] =>
        [0] =>
            [text] = "Hashtag"
            [indices] = 0,8
    [user_mentions] = [object Object],[object Object]
    [urls] = [object Object],[object Object],[object Object]
[in_reply_to_screen_name] = null
[in_reply_to_status_id_str] = null
</snippet>

Моя большая проблема на данный момент в том, что я не знаю, как тестировать эти списки без подгонки jquery.js.Как только я узнаю, как изолировать эти списки в коде, строковые функции для работы со списками, разделенными запятыми, не будут выглядеть идеально подходящими ... Любой совет будет приветствоваться.

Спасибо,

Пропустить

1 Ответ

1 голос
/ 17 апреля 2011

ОК, вот тощий. Это массив!

$. IsArray (val) вернет true и идентифицирует его как таковой, и его можно повторить с помощью $ .each (); так же, как и другие объекты.

Это допустимая структура объекта из допустимого JSON, и ее можно избежать, используя опцию JSON_FORCE_OBJECT в PHP json_encode (); функция. Для моих нужд лучше не форсировать объект, потому что я также имею дело с массивами целых чисел, которые я хочу вернуть в одной строке.

Для своих нужд я изменил первый if () в моей функции отвода от этого ...

if((val == '[object Object]') && (typeof val == 'object')){

к этому ...

if((val != null) && (typeof val == 'object') &&
    ((val == '[object Object]') || (val[0] == '[object Object]'))){

Это будет соответствовать объектам или массивам объектов, а затем отправлять их обратно в resurse ();

Как ни странно, Javascript жалуется, когда val равен нулю, и мы тестируем против val [0]. Я думаю, это, вероятно, имеет смысл, потому что вы не просто проверяете значение, вы также пытаетесь погрузиться в нулевой объект.

Спасибо за ваше внимание, я выяснил свою проблему, и теперь у меня есть учетная запись на Stackoverflow. Это беспроигрышный вариант!

Еще раз спасибо.

Пропустить


Вот пересмотренная сборкаULfromOBJ (); функция ...

function buildULfromOBJ(obj){
  var fragments = [];

  //declare recursion function
  function recurse(item){
    fragments.push('<ul>'); // start a new <ul>

    $.each(item, function(key, val) {  // iterate through items.

      if((val != null) && (typeof val == 'object') &&   // catch nested objects
               ((val == '[object Object]') || (val[0] == '[object Object]'))){

        fragments.push('<li>[' + key + '] =></li>'); // add '[key] =>'
        recurse(val);            // call recurse to add a nested <ul>

      }else if(typeof(val)=='string'){  // catch strings, add double quotes

        fragments.push('<li>[' + key + '] = \"' + val + '\"</li>');

      }else if($.isArray(val)){         // catch arrays add [brackets]

        fragments.push('<li>[' + key + '] = [' + val + ']</li>');

      }else{                            // default: just print it.

        fragments.push('<li>[' + key + '] = ' + val + '</li>'); 
      }
    });
    fragments.push('</ul>'); // close </ul>
  }
  // end recursion function

  recurse(obj);            // call recursion
  return fragments.join('');    // return results
}  // end buildULfromJSON()

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

Вот тот же фрагмент, который я выложил ранее, на этот раз правильно отформатированный ...

<snippet>
[text] = "#Hashtag @PithyTwits @LuvsIt2 http://link1.com http://link2.com http://link3.com"
[retweet_count] = 0
[entities] =>
    [hashtags] =>
        [0] =>
            [text] = "Hashtag"
            [indices] = [0,8]
    [user_mentions] =>
        [0] =>
            [indices] = [9,20]
            [screen_name] = "PithyTwits"
            [name] = "[object Object]"
            [id_str] = "258175966"
            [id] = 258175966
        [1] =>
            [indices] = [21,29]
            [screen_name] = "LuvsIt2"
            [name] = "Strictly Indifferent"
            [id_str] = "255883555"
            [id] = 255883555
    [urls] =>
        [0] =>
            [indices] = [30,46]
            [url] = "http://link1.com"
            [expanded_url] = null
        [1] =>
            [indices] = [47,63]
            [url] = "http://link2.com"
            [expanded_url] = null
        [2] =>
            [indices] = [64,80]
            [url] = "http://link3.com"
            [expanded_url] = null
[in_reply_to_screen_name] = null
</snippet>

Обратите внимание, что [entity] [user_mentions] [0] [name] = "[object Object]" я вставил это, чтобы гарантировать, что строковые значения не нарушают код. Также обратите внимание на элементы [индексы]. Это те массивы, которые я предпочитаю видеть в одной строке (я получаю анальный за глупые вещи :))

Еще раз спасибо!

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