2015-03-23 4 views
-1

Я очень надеюсь, что вы сможете мне помочь, поскольку я потратил на это слишком много времени. Во-первых, мое форматирование JSON, к сожалению, не очень изменчиво, и я переместил его в несколько разных форматов для поддержки как некоторого jquery, так и поиска на основе php. Каждый раз, когда я его перемещаю, поиск будет работать, а остальная часть сайта сломается или наоборот.javascript/jquery Доступ к массиву JSON по имени и индексу

Возможно ли получить доступ к массиву JSON по имени и номеру индекса? Вот моя JSON (хранится в PHP файл и будет получен & успешно преобразован в допустимый формат JSON):

<?php 

$contents = array(
'Song Name #1 by Artist Name #1 (maininfo)' => array(
    'contentid' => '1', 
    'aname' => 'Artist Name', 
    'sname' => 'Song Name', 
    'main' => 'core content #1', 
    'maininfo' => 'url') 
), 
'Song Name #2 by Artist Name #2 (maininfo)' => array(
    'contentid' => '2', 
    'aname' => 'Artist Name', 
    'sname' => 'Song Name', 
    'main' => 'core content #2', 
    'maininfo' => 'url') 
); 

?> 

Мой поиск не работает, когда что-то в названии массива соответствует, в противном случае она возвращает не соответствует, так что я должен оставить Заголовок массива как есть.

Другая часть моего проекта использует JQuery и имеет следующее:

parse(jsonobj[0][1]['sname']) //successfully already returning 'Song Name' 

выше будет работать только когда название массива не предусмотрено (например «Song # Название 1 по имени исполнителя # 1 (maininfo)»=> массив ( становится просто массив (

для тех, кому интересно, файл преобразуется в формат JSON с помощью:.

var jsonobj; 

    $.ajax({ 
     url: 'getjson.php', 
     dataType: "json", 
     success: function (doc) { 

     jsonobj = doc; 

     } 
    }); 

На стороне PHP, когда getjson.php называется массив JSON (выше) загружен в систему и преобразуется в действительный JSON с помощью:

$final = array($final_contents); 
header('Content-type: application/json'); 
echo json_encode($final); 

Примечание: $ final_contents составляет всего $ содержимое с дополнительным заголовком добавленной , См. Searching JSON array for values and accessing surrounding keys/values; output as JSON для PHP. У меня есть конкретная работа.

Заранее спасибо.

+0

Можете ли вы также вставить код, который используется для передачи $ content в обратный вызов jquery при успехе? –

+0

@AshutoshNigam - Я считаю, что я просто добавил его в исходное сообщение. В принципе, вызов ajax json загружает файл с именем getjson.php, который захватывает массив JSON-стиля, который у меня есть в php, и преобразует его в действительный JSON. См. Ссылку, которую я добавил для сообщения, которое у меня было вчера, с другим вызовом - он содержит PHP. –

ответ

0

JavaScript не поддерживает массивы с именованными индексами. Вы должны закодировать его как объект JSON.

var $contents = { 
    "Song Name #1 by Artist Name #1 (maininfo)": { 
     "contentid": 1, 
     "aname": "Artist Name", 
     "sname": "Song Name", 
     "main": "core content #1", 
     "maininfo": "url" 
    },{ 
    "Song Name #2 by Artist Name #2 (maininfo)": { 
     "contentid": 2, 
     "aname": "Artist Name", 
     "sname": "Song Name", 
     "main": "core content #2", 
     "maininfo": "url" 
    } 
}; 

Хотя это, вероятно, будет лучше расположить его таким образом (вот fiddle, чтобы продемонстрировать:

var songs = [ 
    { 
     "contentid": 1, 
     "artist": "Artist Name", 
     "title": "Song Title 1", 
     "main": "core content #1", 
     "maininfo": "url" 
    }, 
    { 
     "contentid": 2, 
     "artist": "Artist Name", 
     "title": "Song Title 2", 
     "main": "core content #2", 
     "maininfo": "url" 
    } 
]; 

Тогда вы можете осуществлять поиск по списку песен по идентификатору или перебирать фильтровать по конкретным . поле значения например, чтобы найти все песни, названия которых начинаются с «Название песни»:

var findAllSongs = function(prop, value){ 
    var result = new Array(); 
    for (var i = 0; i < songs.length; i++) { 
     var song = songs[i]; 
     if (song[prop] && (song[prop] === value || song[prop].search(value) >= 0)){ 
      result.push(song); 
     } 
    } 
    return result; 
}; 

var song = findAllSongs("title","Song Title 2")[0]; 
alert(song.contentid); 
// Outputs "2" 

РНР эквивалент моей JSON выше:

$songs = array(
    array(
     "contentid" => 1, 
     "artist" => "Artist Name", 
     "title" => "Song Title 1", 
     "main" => "core content #1", 
     "maininfo" => "url", 
    ), 
    array(
     "contentid" => 2, 
     "artist" => "Artist Name", 
     "title" => "Song Title 2", 
     "main" => "core content #2", 
     "maininfo" => "url",  
    ) 
); 

Если вы используете PHP 5.4 или выше, вы можете использовать короткий синтаксис:

$songs = [ 
    [ 
     "contentid" => 1, 
     "artist" => "Artist Name", 
     "title" => "Song Title 1", 
     "main" => "core content #1", 
     "maininfo" => "url", 
    ],[ 
     "contentid" => 2, 
     "artist" => "Artist Name", 
     "title" => "Song Title 2", 
     "main" => "core content #2", 
     "maininfo" => "url",  
    ] 
]; 

Затем вы можете превратить его в JSON, используя текущий метод:

json_encode($songs); 
+0

Спасибо Стиву за потраченное время здесь. Я обеспокоен тем, что php-сторона из дома не будет работать с этим методом.Фир, который называется следующим образом: include ('sample_data.php'); - примеры данных включают данные, которые я показал выше. Распределенные JSON-схемы, которые вы указали выше, предназначены для JS и не являются допустимым синтаксисом в PHP. Извините, не пытаясь быть трудным, но имея проблемы с пониманием. –

+0

Обновлено мое сообщение, чтобы было ясно, что мне нужно хранить JSON массив в PHP. PHP-скрипт втягивает его, а затем использует $ final = array ($ final_contents); header ('Content-type: application/json'); echo json_encode ($ final); --- Вот как это в конечном итоге попадает в формат JSON. Когда вызывается getjson.php, действительный JSON возвращается файлом php. –

+0

Большое спасибо @Steve K - Я все настроен сейчас! Внимательно оцените свое время и усилия. Спасибо всем, кто представил ответы, а также - моя загрузка или вызовы ajax не были проблемой в конце, я просто не знал, что не могу назвать массивы в JS. Используя комбинацию того, что Стив предложил и изменил PHP (благодаря другому пользователю SO!), Я работаю! –

0

У вас есть массив. преобразовать его в формат JSON, используя следующий код (json_encode) и эхо, так что JQuery можно получить его:

$jsonVar = json_encode($contents); 
echo $jsonVar; 

Update:

код для вызова JSON с помощью ajax является:

$.ajax({ 
    dataType: "json", 
    url: url, 
    data: data, 
    success: success 
}); 

В качестве альтернативы вы можете сокращенно:

$.getJSON("ajax/test.json", function(data) { 
    var items = []; 
    $.each(data, function(key, val) { 
    items.push("<li id='" + key + "'>" + val + "</li>"); 
    }); 

    $("<ul/>", { 
    "class": "my-new-list", 
    html: items.join("") 
    }).appendTo("body"); 
}); 

Конечно, е файл посылается должен быть в формате JSON, то есть:

{ 
    "one": "Singular sensation", 
    "two": "Beady little eyes", 
    "three": "Little birds pitch by my doorstep" 
} 

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

+0

Обновленный вопрос, чтобы показать, что я уже получаю действительный JSON. Пожалуйста, просмотрите и сообщите мне, будет ли ваш предложенный ответ по-прежнему жизнеспособен. Благодарю. –

+0

@ KurtW обновленный ответ, чтобы указать правильную ссылку на стороне jquery. Код, который вы поделили, - использовать json как callback, не переходящий в json. –

+0

@KurtW Я предлагаю, вы просто попробуйте отправить строку json вместо php-массива, как я предложил, чтобы узнать, работает ли это для вас. –

Смежные вопросы