2013-08-30 2 views
2

Я пытаюсь декодировать файл JSON.Декодирование JSON в PHP

Вышеприведенный экстракт JSON показан ниже. Чтобы более точно описать этот JSON, это 3 X набора кода JSON. Я пытаюсь извлечь значения, связанные с «main_train_uid» и «assoc_train_uid», например G90491 и G90525, из первой строки.

Я пытался копировать примеры кода, показанные в различных частях StackOverflow, но терплю неудачу

Я понимаю, что это должно быть относительно легко, но я просто не могу получить его. Выход, который я получаю, Ошибка Json с ошибкой: 0. Это не укажет ничего плохого, но я не получаю значения. Я все время путаюсь между массивами и объектами. Мой код отображается после выписки JSON.

{"JsonAssociationV1":{"transaction_type":"Delete","main_train_uid":"G90491","assoc_train_uid":"G90525","assoc_start_date":"2013-09-07T00:00:00Z","location":"EDINBUR","base_location_suffix":null,"diagram_type":"T","CIF_stp_indicator":"O"}} 
{"JsonAssociationV1":{"transaction_type":"Delete","main_train_uid":"P20328","assoc_train_uid":"P21318","assoc_start_date":"2013-08-23T00:00:00Z","location":"MARYLBN","base_location_suffix":null,"diagram_type":"T","CIF_stp_indicator":"C"}} 
{"JsonAssociationV1":{"transaction_type":"Delete","main_train_uid":"L13077","assoc_train_uid":"L13045","assoc_start_date":"2013-08-23T00:00:00Z","location":"STPANCI","base_location_suffix":null,"diagram_type":"T","CIF_stp_indicator":"C"}} 

Сниппет JSON хранится в json.txt

<?php 

$file = "json.txt"; 
$trains = file_get_contents($file); 

foreach (explode("\n", $trains) as $line) { 

    $train = json_decode($line,true); 

    if (is_array($train)) { 

    foreach($train as $item=>$value) { 

     foreach($value as $entry) { 
     echo $entry->main_train_uid; 
     echo $entry->assoc_train_uid; 

     } 
    } 
    } 
}    


if (is_null($json_train)) { 
    die("Json decoding failed with error: ". json_last_error()); 
} 

?> 

Благодаря в ожидании Джон

EDIT

Благодаря Barmar

Мой новый код как bel вл

<?php 
$file = "json.txt"; 


$trains = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
foreach ($trains as $train) { 
$json=json_decode($train,true); 

foreach($json as $item=>$value) { 
print_r($item); 
foreach($value as $entry) { 
echo '<br>'; 
print_r($entry); 


} 
} 
} 



if (is_null($json)) { 
die("Json decoding failed with error: ". json_last_error()); 
} 

?> 

Сейчас я получаю следующий результат (т.е. значения) без каких-либо ошибок, является большим

JsonAssociationV1 
Delete 
G90491 
G90525 
2013-09-07T00:00:00Z 
EDINBUR 

T 
OJsonAssociationV1 
Delete 
P20328 
P21318 
2013-08-23T00:00:00Z 
MARYLBN 

T 
CJsonAssociationV1 
Delete 
L13077 
L13045 
2013-08-23T00:00:00Z 
STPANCI 

T 
C 

Однако я до сих пор не могу выделить некоторые индивидуальные значения эха самой по себе (мне нужно сделать это, чтобы поместить их в базу данных позже). Так, например, я до сих пор не могу получить на только с указанием значения для main_train_uid

Кроме того, поскольку один из значений NULL это, кажется, толкая вниз определенные значения в следующий набор JSON. Например, T и C показано из положить выше

Любая дополнительная помощь оценили

Благодарности

+0

когда в сомнении, используйте 'print_r', ex:' $ train = json_decode ($ line, true); echo '
'. print_r ($ train, true). '
'; ' – OneOfOne

+0

Нет переменной' $ json_train', имя переменной - '$ train'. – Barmar

+0

Нули ничего не нажимают, они просто печатают пустые строки для этих значений. Вот как «echo» и «print_r» печатают нулевые и ложные значения, они печатаются как пустые строки. Используйте 'var_dump', чтобы вы всегда могли видеть значения. – Barmar

ответ

2

две проблемы, которые я вижу с этим:

Во-первых, если файл заканчивается символом новой строки , explode("\n", $trains) вернет массив, который заканчивается пустой строкой. Когда вы назовете json_decode() на этот элемент, он вернет NULL с json_last_error() == 0. Попробуйте:

foreach (array_filter(explode("\n", $trains) as $train)) { 
    ... 
} 

Или, вместо того, чтобы использовать file_get_contents(), вы могли бы использовать file():

$trains = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
foreach ($trains as $train) { 
    ... 
} 

Во-вторых, if (is_null($json_train)) тестирует переменную, которая никогда не была установлена. Правильная переменная - $train.

Чтобы получить конкретное поле из JSON, используйте $value['main_train_uid']

foreach ($trains as $train) { 
    $json=json_decode($train,true); 
    foreach ($json as $key => $value) { 
     echo $key . "<br>" . $value['main_train_uid'] . "<br>"; 
    } 
} 
+0

Спасибо Barmar и OnetoOne. Очень полезно. Я добавила дополнительную редакцию. Определенно движется вперед. Просто был еще один запрос выше. Еще раз спасибо – user2635961

0

, потому что вы получите ошибку при декодировании на основе сообщений Айв JSon опубликовал способ бросить исключение, когда это произойдет, так что вы можете справиться с ошибка на лучшем пути.

Можно также расширить класс, чтобы он мог справиться с закодировать также

class Json { 

    public static function decode($jsonString, $returnArray = true) { 
     if ((string)$jsonString !== $jsonString) { // faster !is_string check 
      throw new Exception('input should be a string'); 
     } 

     $decodedString = json_decode($jsonString, $returnArray) 

     if ((unset)$decodedString === $decodedString) { // faster is_null check, why NULL check because json_decode return NULL with failure. 
      $errorArray = error_get_last(); // fetch last error this should be the error of the json decode or it could be a date timezone error if you didn't set it correctly 

      throw new Exception($errorArray['message']); 
     } 
     return $decodedString; 
    } 
} 



try { 
    Json::decode("ERROR"); 
} catch (Exception $e) { } 

Просто замените эту строку, например

$json=json_decode($train,true); 

С этим

try { 
    Json::decode($train,true); 
} catch (Exception $e) { 
    // handle json decode exception here note if you don't try catch the code will terminate 
    // here you can handle what you want want to do 
} 
+0

Это полезно Raymond. Как я могу вызвать его в скрипте? – user2635961

+0

Добавлен пример просмотра сообщений –

Смежные вопросы