javascript / jquery通过名称和索引访问JSON数组

时间:2015-03-23 04:16:22

标签: php jquery arrays json

我非常希望你能帮助我,因为我花了太多时间在这上面。首先,遗憾的是我的JSON格式不是很可变,我已将它移动到许多不同的格式,以支持一些jquery和基于php的搜索。每次移动它时,搜索都会起作用,网站的其余部分会中断,反之亦然。

是否可以通过名称和索引号访问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'

上述仅在未提供阵列标题时才有效(例如&#39;歌曲名称#1由艺术家名称#1(主要信息)&#39; =&gt;阵列(成为只需数组(

对于那些好奇的人,使用以下方法将文件转换为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只是$内容,并添加了额外的标题。有关我专门运行的PHP,请参阅Searching JSON array for values and accessing surrounding keys/values; output as JSON

提前谢谢你。

2 个答案:

答案 0 :(得分:0)

你有阵列。使用以下代码(json_encode)和echo将其转换为json,以便jquery可以接收它:

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

更新

使用ajax调用json的代码是:

$.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。

答案 1 :(得分: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"   
    }
];

然后,您可以按ID搜索歌曲列表,或者迭代以过滤特定的字段值。例如,查找标题以&#34;歌曲标题&#34;:

开头的所有歌曲
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的php等价物是:

$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);