从 Curl APi 调用输出 JSON 到 Ajax

Outputting JSON from Curl APi call to Ajax

我正在做一个课程项目,我需要使用 php 来拨打 api 电话。

Ajax 调用如下所示:

$('#btnOneRun').click(function() {
    $.ajax({
        url: "libs/php/getCapitalSummary.php",
        type: 'POST',
        dataType: 'json',
        success: function(result) {
            if (result.status.name == "ok") {
                console.log(result)
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(errorThrown)
        }
    }); 
});

php api 调用如下所示:

<?php

    // remove for production

    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

    $executionStartTime = microtime(true);



    $url='http://api.geonames.org/wikipediaSearchJSON?formatted=true&q=london&maxRows=1&username=flightltd&style=full';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL,$url);

    $result=curl_exec($ch);

    curl_close($ch);

    $decode = json_decode($result, true);   

    $output['status']['code'] = "200";
    $output['status']['name'] = "ok";
    $output['status']['description'] = "success";
    $output['status']['returnedIn'] = intval((microtime(true) - $executionStartTime) * 1000) . " ms";
    $output['data'] = $decode['geonames'];

    
    header('Content-Type: application/json; charset=UTF-8');

    echo json_encode($output); 

?>

这非常有效。我使用相同的例程对 geonames API 进行类似的调用,并且这样做没有任何问题,因为它们提供了根对象的名称 returned。在上面的例子中,它被称为 geonames

$output['data'] = $decode['geonames'];

我正在尝试使用此模式调用 accuweather API。但是,为此,我没有根对象的名称。

我使用了上面的例程,将特定代码行更改为 $output['data'] = $result; 瞧,我可以看到 geonames 的来源。

{
    "status": {
        "code": "200",
        "name": "ok",
        "description": "success",
        "returnedIn": "120 ms"
    },
    "data": "{\"geonames\": [{\n  \"summary\": \"London is the capital and most populous city of England and the United Kingdom. Standing on the River Thames, London has been a major settlement for two millennia, its history going back to its founding by the Romans, who named it Londinium (...)\",\n  \"elevation\": 8,\n  \"geoNameId\": 2643743,\n  \"feature\": \"city\",\n  \"lng\": -0.11832,\n  \"countryCode\": \"GB\",\n  \"rank\": 100,\n  \"thumbnailImg\": \"http://www.geonames.org/img/wikipedia/43000/thumb-42715-100.jpg\",\n  \"lang\": \"en\",\n  \"title\": \"London\",\n  \"lat\": 51.50939,\n  \"wikipediaUrl\": \"en.wikipedia.org/wiki/London\"\n}]}"
}

此时我想:“现在我只需要对 Accuweather 的 API 调用做同样的事情,我将能够找到我需要在 [=20 上的大括号之间键入的内容=] 但是当我尝试这样做时,JSON return 不会显示像上面那样的对象。

从 accuweather API 直接从我的 javascript 文件或通过他们网站上的示例调用时,JSON return 看起来像这样:

[
  {
    "LocalObservationDateTime": "2022-03-10T06:47:00+00:00",
    "EpochTime": 1646894820,
    "WeatherText": "Light rain",
    "WeatherIcon": 12,
    "HasPrecipitation": true,
    "PrecipitationType": "Rain",
    "IsDayTime": true,
    "Temperature": {
      "Metric": {
        "Value": 8,
        "Unit": "C",
        "UnitType": 17
      },
      "Imperial": {
        "Value": 46,
        "Unit": "F",
        "UnitType": 18
      }
    },
    "MobileLink": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us",
    "Link": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us"
  }
]

我正在寻求两件事之一的帮助:

a) 一种在不知道对象名称的情况下解码 JSON 对象并将其输出到 AJAX 调用的方法,或者;

b) 在 javascript 上接收解码对象并对其进行解码以访问其属性。

非常感谢您。

编辑:我仔细研究了 PHP 并意识到我不明白 php 例程只是使用括号表示法来访问解码对象的属性:$decode['geonames'] .

我继续研究它并意识到我可以在我的 javascript 文件中使用 JSON.parse()

所以我将 php 文件中的特定代码行更改为 $output['data'] = $result;

然后在我的 ajax 调用中,我可以访问使用调用 JSON.parse(result.data) 后返回的 JSON 的属性,如下所示:

$('#btnOneRun').click(function() {
    $.ajax({
        url: "libs/php/getWeather.php",
        type: 'POST',
        dataType: 'json',
        success: function(result) {
            if (result.status.name == "ok") {
        console.log(JSON.parse(result.data))
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(errorThrown)
        }
    }); 
});

这被记录为:

[
    {
        "LocalObservationDateTime": "2022-03-10T08:13:00+00:00",
        "EpochTime": 1646899980,
        "WeatherText": "Mostly cloudy",
        "WeatherIcon": 6,
        "HasPrecipitation": false,
        "PrecipitationType": null,
        "IsDayTime": true,
        "Temperature": {
            "Metric": {
                "Value": 9.1,
                "Unit": "C",
                "UnitType": 17
            },
            "Imperial": {
                "Value": 48,
                "Unit": "F",
                "UnitType": 18
            }
        },
        "MobileLink": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us",
        "Link": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us"
    }
]