获取这些从XML转换为JSON的API结果的正确代码是什么



我有一个PHP页面bookscript.PHP,专门用于将Goodreads API结果从XML格式转换为JSON格式。代码如下:

<?php 
    $xml_string = file_get_contents("https://www.goodreads.com/search?q=" .$_REQUEST['search']. "&search%5Bfield%5D=title&format=xml&key=ZuqW9sL15d3JvEwmLyaNCg");
    $xml = simplexml_load_string($xml_string);
    $json = json_encode($xml);
    $array = json_decode($json,TRUE);
    echo $json;
?>

在我的主页上,我将bookscript.php插入这个AJAX调用:

  function GetBooks(request) {
    //Replace spaces with a '+'
    var url = request.term.replace(/s/g,"+");
    return $.ajax({
        'url': "php/bookscript.php?search=" + url,
        'dataType': 'json'
    }).then(function(data){
        return $.map(data.results || [], function(v,i){
            return {
                label: v.work.title + ' BOOK (' + v.work.original_publication_year + ')',
                value: v.work.title
            }
        });
  })

以下是Goodread在搜索"Mockingbird"时得到的原始XML结果的JSON版本(https://www.goodreads.com/search/index.xml?&key=ZuqW9sL15d3JvEwmLyaNCg&q=知更鸟):

{"Request":{"authentication":"true","key":{},"method":{}},"search":{"query":{},"results-start":"1","results-end":"20","total-results":"453","source":"Goodreads","query-time-seconds":"0.15","results":{"work":[{"id":"3275794","books_count":"415","ratings_count":"2789161","text_reviews_count":"61819","original_publication_year":"1960","original_publication_month":{"@attributes":{"type":"integer","nil":"true"}},"original_publication_day":{"@attributes":{"type":"integer","nil":"true"}},"average_rating":"4.24","best_book":{"@attributes":{"type":"Book"},"id":"2657","title":"To Kill a Mockingbird","author":{"id":"1825","name":"Harper Lee"},"image_url":"https://d.gr-assets.com/books/1361975680m/2657.jpg","small_image_url":"https://d.gr-assets.com/books/1361975680s/2657.jpg"}},{"id":"6790315","books_count":"21","ratings_count":"20230","text_reviews_count":"3203","original_publication_year":"2010","original_publication_month":"1","original_publication_day":"1","average_rating":"4.17","best_book":{"@attributes":{"type":"Book"},"id":"6596547","title":"Mockingbird","author":{"id":"688672","name":"Kathryn Erskine"},"image_url":"https://d.gr-assets.com/books/1301271068m/6596547.jpg","small_image_url":"https://d.gr-assets.com/books/1301271068s/6596547.jpg"}},{"id":"7100578","books_count":"8","ratings_count":"5526","text_reviews_count":"942","original_publication_year":"2010","original_publication_month":"11","original_publication_day":"2","average_rating":"3.79","best_book":{"@attributes":{"type":"Book"},"id":"6882274","title":"The Mockingbirds (The Mockingbirds, #1)","author":{"id":"3081700","name":"Daisy Whitney"},"image_url":"https://d.gr-assets.com/books/1281310031m/6882274.jpg","small_image_url":"https://d.gr-assets.com/books/1281310031s/6882274.jpg"}},{"id":"313880","books_count":"37","ratings_count":"2856","text_reviews_count":"295","original_publication_year":"1980","original_publication_month":{"@attributes":{"type":"integer","nil":"true"}},"original_publication_day":{"@attributes":{"type":"integer","nil":"true"}},"average_rating":"4.12","best_book":{"@attributes":{"type":"Book"},"id":"323172","title":"Mockingbird","author":{"id":"4448408","name":"Walter Tevis"},"image_url":"https://s.gr-assets.com/assets/nophoto/book/111x148-bcc042a9c91a29c1d680899eff700a03.png","small_image_url":"https://s.gr-assets.com/assets/nophoto/book/50x75-a91bf249278a81aabab721ef782c4a74.png"}},{"id":"372876","books_count":"3","ratings_count":"637","text_reviews_count":"50","original_publication_year":"1998","original_publication_month":{"@attributes":{"type":"integer","nil":"true"}},"original_publication_day":{"@attributes":{"type":"integer","nil":"true"}},"average_rating":"3.86","best_book":{"@attributes":{"type":"Book"},"id":"383106","title":"Mockingbird","author":{"id":"13143","name":"Sean Stewart"},"image_url":"https://d.gr-assets.com/books/1354903122m/383106.jpg","small_image_url":"https://d.gr-assets.com/books/1354903122s/383106.jpg"}},{"id":"21954272","books_count":"2","ratings_count":"56","text_reviews_count":"24","original_publication_year":"2013","original_publication_month":"8","original_publication_day":"13","average_rating":"3.61","best_book":{"@attributes":{"type":"Book"},"id":"16129330","title":"Mockingbird","author":{"id":"6572384","name":"Julie Trimingham"},"image_url":"https://d.gr-assets.com/books/1386729777m/16129330.jpg","small_image_url":"https://d.gr-assets.com/books/1386729777s/16129330.jpg"}},{"id":"44458285","books_count":"71","ratings_count":"104794","text_reviews_count":"18897","original_publication_year":"2015","original_publication_month":"7","original_publication_day":"14","average_rating":"3.32","best_book":{"@attributes":{"type":"Book"},"id":"24817626","title":"Go Set a Watchman (To Kill a Mockingbird, #2)","author":{"id":"1825","name":"Harper Lee"},"image_url":"https://d.gr-assets.com/books/1451442088m/24817626.jpg","small_image_url":"https://d.gr-assets.com/books/1451442088s/24817626.jpg"}},{"id":"676450","books_count":"8","ratings_count":"609","text_reviews_count":"142","original_publication_year":"2007","original_publication_month":"4","original_publication_day":"1","average_rating":"3.46","best_book":{"@attributes":{"type":"Book"},"id":"690102","title":"In Search of Mockingbird","author":{"id":"369002","name":"Loretta Ellsworth"},"image_url":"https://d.gr-assets.com/books/1316727230m/690102.jpg","small_image_url":"https://d.gr-assets.com/books/1316727230s/690102.jpg"}},{"id":"26123583","books_count":"4","ratings_count":"2541","text_reviews_count":"593","original_publication_year":"2014","original_publication_month":"5","original_publication_day":"20","average_rating":"3.79","best_book":{"@attributes":{"type":"Book"},"id":"18465605","title":"I Kill the Mockingbird","author":{"id":"321290","name":"Paul Acampora"},"image_url":"https://d.gr-assets.com/books/1380963917m/18465605.jpg","small_image_url":"https://d.gr-assets.com/books/1380963917s/18465605.jpg"}},{"id":"41055515","books_count":"1","ratings_count":"0","text_reviews_count":"0","original_publication_year":"2014","original_publication_month":"1","original_publication_day":"1","average_rating":"0.0","best_book":{"@attributes":{"type":"Book"},"id":"21799755","title":"Mockingbird","author":{"id":"7189690","name":"X"},"image_url":"https://s.gr-assets.com/assets/nophoto/book/111x148-bcc042a9c91a29c1d680899eff700a03.png","small_image_url":"https://s.gr-assets.com/assets/nophoto/book/50x75-a91bf249278a81aabab721ef782c4a74.png"}},{"id":"18281451","books_count":"21","ratings_count":"2406","text_reviews_count":"382","original_publication_year":"2012","original_publication_month":"1","original_publication_day":"1","average_rating":"4.13","best_book":{"@attributes":{"type":"Book"},"id":"13108221","title":"Mockingbird (Miriam Black, #2)","author":{"id":"17152","name":"Chuck Wendig"},"image_url":"https://d.gr-assets.com/books/1330371155m/13108221.jpg","small_image_url":"https://d.gr-assets.com/books/1330371155s/13108221.jpg"}},{"id":"19221873","books_count":"2","ratings_count":"1665","text_reviews_count":"238","original_publication_year":"2013","original_publication_month":"4","original_publication_day":"23","average_rating":"4.06","best_book":{"@attributes":{"type":"Book"},"id":"15843172","title":"Tequila Mockingbird: Cocktails with a Literary Twist","author":{"id":"5446689","name":"Tim Federle"},"image_url":"https://d.gr-assets.com/books/1359423297m/15843172.jpg","small_image_url":"https://d.gr-assets.com/books/1359423297s/15843172.jpg"}},{"id":"3570755","books_count":"3","ratings_count":"46","text_reviews_count":"9","original_publication_year":"1998","original_publication_month":{"@attributes":{"type":"integer","nil":"true"}},"original_publication_day":{"@attributes":{"type":"integer","nil":"true"}},"average_rating":"3.59","best_book":{"@attributes":{"type":"Book"},"id":"1619397","title":"Mockingbird","author":{"id":"45317","name":"Allan Ahlberg"},"image_url":"https://s.gr-assets.com/assets/nophoto/book/111x148-bcc042a9c91a29c1d680899eff700a03.png","small_image_url":"https://s.gr-assets.com/assets/nophoto/book/50x75-a91bf249278a81aabab721ef782c4a74.png"}},{"id":"15930583","books_count":"8","ratings_count":"837","text_reviews_count":"185","original_publication_year":"2012","original_publication_month":"2","original_publication_day":"6","average_rating":"3.70","best_book":{"@attributes":{"type":"Book"},"id":"11011545","title":"The Rivals (The Mockingbirds, #2)","author":{"id":"3081700","name":"Daisy Whitney"},"image_url":"https://d.gr-assets.com/books/1329509815m/11011545.jpg","small_image_url":"https://d.gr-assets.com/books/1329509815s/11011545.jpg"}},{"id":"25647256","books_count":"2","ratings_count":"197","text_reviews_count":"27","original_publication_year":"2013","original_publication_month":"2","original_publication_day":"20","average_rating":"3.73","best_book":{"@attributes":{"type":"Book"},"id":"18218379","title":"The Song of the Mockingbird","author":{"id":"6448032","name":"Bill Cronin"},"image_url":"https://d.gr-assets.com/books/1376853384m/18218379.jpg","small_image_url":"https://d.gr-assets.com/books/1376853384s/18218379.jpg"}},{"id":"808023","books_count":"13","ratings_count":"1472","text_reviews_count":"62","original_publication_year":"1972","original_publication_month":"1","original_publication_day":"1","average_rating":"4.14","best_book":{"@attributes":{"type":"Book"},"id":"39774","title":"Mockingbird Wish Me Luck","author":{"id":"13275","name":"Charles Bukowski"},"image_url":"https://d.gr-assets.com/books/1407706745m/39774.jpg","small_image_url":"https://d.gr-assets.com/books/1407706745s/39774.jpg"}},{"id":"21946472","books_count":"6","ratings_count":"974","text_reviews_count":"219","original_publication_year":"2013","original_publication_month":"6","original_publication_day":"1","average_rating":"3.77","best_book":{"@attributes":{"type":"Book"},"id":"16124135","title":"When Mockingbirds Sing","author":{"id":"3448642","name":"Billy Coffey"},"image_url":"https://d.gr-assets.com/books/1351878615m/16124135.jpg","small_image_url":"https://d.gr-assets.com/books/1351878615s/16124135.jpg"}},{"id":"45115186","books_count":"4","ratings_count":"89","text_reviews_count":"34","original_publication_year":"2015","original_publication_month":"5","original_publication_day":"7","average_rating":"4.10","best_book":{"@attributes":{"type":"Book"},"id":"25368964","title":"Mockingbird Songs","author":{"id":"1086719","name":"R.J. Ellory"},"image_url":"https://d.gr-assets.com/books/1429176973m/25368964.jpg","small_image_url":"https://d.gr-assets.com/books/1429176973s/25368964.jpg"}},{"id":"40785903","books_count":"4","ratings_count":"1576","text_reviews_count":"227","original_publication_year":"2014","original_publication_month":"6","original_publication_day":"26","average_rating":"4.27","best_book":{"@attributes":{"type":"Book"},"id":"21468147","title":"Tequila Mockingbird (Sinners #3)","author":{"id":"4968409","name":"Rhys Ford"},"image_url":"https://d.gr-assets.com/books/1394939612m/21468147.jpg","small_image_url":"https://d.gr-assets.com/books/1394939612s/21468147.jpg"}},{"id":"20261011","books_count":"2","ratings_count":"5","text_reviews_count":"3","original_publication_year":"2009","original_publication_month":"12","original_publication_day":"7","average_rating":"4.60","best_book":{"@attributes":{"type":"Book"},"id":"12592969","title":"The Song of the Mockingbird","author":{"id":"5524594","name":"McDonald Mark McDonald"},"image_url":"https://s.gr-assets.com/assets/nophoto/book/111x148-bcc042a9c91a29c1d680899eff700a03.png","small_image_url":"https://s.gr-assets.com/assets/nophoto/book/50x75-a91bf249278a81aabab721ef782c4a74.png"}}]}}}

尽管XML到JSON的转换很成功,但我仍然有问题:

  1. 我不知道如何从bookscript.php中的JSON中获取图书标题。正如你所看到的,我在AJAX代码中的猜测是使用"data.results",然后使用"v.work.title",但我认为这不起作用。

  2. 如果我在bookscript.php URL中插入两个单词的搜索,如http://example.com/php/bookscript.php?search=lord+ringshttp://example.com/php/bookscript.php?search=lord%20rings,结果只是bookscript.php显示单词"false"。相比之下,在goodreads.com(https://www.goodreads.com/search/index.xml?&key=ZuqW9sL15d3JvEwmLyaNCg&q=lord%20rings or https://www.goodreads.com/search/index.xml?&key=ZuqW9sL15d3JvEwmLyaNCg&q=lord+rings)中插入多个单词效果很好。如何让bookscript.php处理多个单词的搜索查询?

谢谢。

这不是我的领域,所以这里只是一些建议:对于1.,我将使用PHP的JSONPath实现,如:PHP的JSON路径用于查询JSON输出(或者可以在原始XML上使用等效的XPath实现)对于2.,我会更改所有单词1%20word2->word1+word2我希望这能有所帮助!C.

最新更新