从文件中每行解码多个json

时间:2019-07-19 17:10:42

标签: php arrays json extract

我们正在尝试提取写入文件的多个json对象的某些信息。每行只有一个,需要从每行中获取一些字符串并打印特定信息。

这种JSON格式非常奇怪,我想知道是否有代码来实现我们所需的结果

{'creationDate': None, 'endTime': 1563754500.0, 'expirationDate': 1563743700.0, 'isPriorityOffer': False, 'offerId': 'AAGutxx7466', 'offerType': 'NON_EXCLUSIVE', 'rateInfo': {'currency': 'USD', 'isSurge': False, 'priceAmount': 54.0, 'projectedTips': 0.0, 'surgeMultiplier': None}, 'schedulingType': 'BLOCK', 'serviceAreaId': 'dd00ctyy', 'serviceTypeId': 'PuyOplzlR1idvfPkv5138g', 'serviceTypeMetadata': {'nameClassification': 'STANDARD'}, 'startTime': 1563743700.0, 'startingLocation': {'address': {'address1': '', 'address2': None, 'address3': None, 'addressId': None, 'city': None, 'countryCode': None, 'name': None, 'phone': None, 'postalCode': None, 'state': None}, 'geocode': {'latitude': 0.0, 'longitude': 0.0}, 'locationType': None, 'startingLocationName': ''}, 'status': 'OFFERED', 'trIds': None}
{'creationDate': None, 'endTime': 1563754500.0, 'expirationDate': 1563741900.0, 'isPriorityOffer': False, 'offerId': 'AAGutxx8547', 'offerType': 'NON_EXCLUSIVE', 'rateInfo': {'currency': 'USD', 'isSurge': False, 'priceAmount': 63.0, 'projectedTips': 0.0, 'surgeMultiplier': None}, 'schedulingType': 'BLOCK', 'serviceAreaId': '50ade699', 'serviceTypeId': 'PuyOplzlR1idvfPkv5138g', 'serviceTypeMetadata': {'nameClassification': 'STANDARD'}, 'startTime': 1563741900.0, 'startingLocation': {'address': {'address1': '', 'address2': None, 'address3': None, 'addressId': None, 'city': None, 'countryCode': None, 'name': None, 'phone': None, 'postalCode': None, 'state': None}, 'geocode': {'latitude': 0.0, 'longitude': 0.0}, 'locationType': None, 'startingLocationName': ''}, 'status': 'OFFERED', 'trIds': None}

我尝试了这段代码,但是无法使用json结构

<?

function readJson($File){

  // open the file to with the R flag,
    $Path = fopen($File,"r");

    // if file found,
    if ($Path) {
        $print = '';

            // for each line
            while (($line = fgets($Path)) !== false) {
                $Output = json_decode($line);
                $print .= "Service Area: ".$Output->serviceAreaId."<br/>";
                $print .= "Start time: ".$Output->startTime."<br/>";
                $print .= "Price: ".$Output->priceAmount."<hr>";
            }

        fclose($Path);
    } 

    return $print;
}

echo readJson("logs.txt");

?>

3 个答案:

答案 0 :(得分:1)

如上所述,这不是有效的JSON。您必须对键和字符串值使用双引号。如果您无法更改文件,则需要对其进行修复:

$line = str_replace(["'", "None", "False"], ['"', 0, 0], $line);
$Output = json_decode($line);

如果除了NoneFalse以外的其他字符串都未加引号,则必须将其添加到str_replace数组中。如果没有设置(可以是任何东西),则需要一个正则表达式。将它们更改为整数比尝试将它们用引号引起来要容易得多。

答案 1 :(得分:0)

请将您的JSON字符串更改为有效的JSON:

{"creationDate": null, "endTime": 1563754500.0, "expirationDate": 1563743700.0, "isPriorityOffer": false, "offerId": "AAGutxx7466", "offerType": "NON_EXCLUSIVE", "rateInfo": {"currency": "USD", "isSurge": false, "priceAmount": 54.0, "projectedTips": 0.0, "surgeMultiplier": null}, "schedulingType": "BLOCK", "serviceAreaId": "dd00ctyy", "serviceTypeId": "PuyOplzlR1idvfPkv5138g", "serviceTypeMetadata": {"nameClassification": "STANDARD"}, "startTime": 1563743700.0, "startingLocation": {"address": {"address1": "", "address2": null, "address3": null, "addressId": null, "city": null, "countryCode": null, "name": null, "phone": null, "postalCode": null, "state": null}, "geocode": {"latitude": 0.0, "longitude": 0.0}, "locationType": null, "startingLocationName": ""}, "status": "OFFERED", "trIds": null}

还必须通过以下方式获取价格

$print .= "Price: ".$Output->rateInfo->priceAmount."<hr>";

在我的机器上,更改后代码正在运行

答案 2 :(得分:0)

尝试一下

我会抓住整个东西,然后处理数据。然后,将其传递回文件时,请执行json_encode($data, JSON_PRETTY_PRINT);,以便对json文件有更好的了解。

抓取数据:

    <?php
        $f = fopen($file, "r");
        $fr = fread($f, filesize($file));
        $arr = json_decode($file, true);
        $fclose($f);

        // access example
        $arr["username"]["id"];

此刻,我正在使用json进行类似的项目,并且对我来说完美无缺。

链接

json_decode()
json_encode()