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


javascript / jquery Accessing JSON array by both name and index

我非常希望你能帮我,因为我在这方面花了太多时间。首先,不幸的是,我的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'

以上仅适用于未提供数组标题的情况(例如"歌手名称#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只是添加了额外标头的$contents。请参阅搜索JSON数组中的值和访问周围的键/值;输出为JSON,用于我专门运行的PHP。

提前谢谢。

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"
    }
};

尽管这样安排可能会更好(这里有一个小提琴来演示:

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搜索歌曲列表,或者迭代以筛选特定的字段值。例如,查找标题以"歌曲标题"开头的所有歌曲:

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

您有一个数组。使用以下代码(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。