Jak wygenerować plik .json w PHP?


127
CREATE TABLE Posts
{
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200),
url VARCHAR(200)
}

json.php

<?php
$sql=mysql_query("select * from Posts limit 20");
echo '{"posts": [';
while($row=mysql_fetch_array($sql))
{
$title=$row['title'];
$url=$row['url'];
echo '

{

"title":"'.$title.'",

"url":"'.$url.'"

},'; 
}
echo ']}';

?>

Muszę wygenerować results.jsonplik.


1
Posiadanie jakiegoś wyjaśnienia / kontekstu w naszym pytaniu jest co najmniej grzeczne. To pytanie wydaje się raczej niejawnym rozkazem nikomu w szczególności i ogólnie społeczności przepełnienia stosu ..
Sl4rtib4rtf4st

Odpowiedzi:


247

Oto przykładowy kod:

<?php 
$sql="select * from Posts limit 20"; 

$response = array();
$posts = array();
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)) { 
  $title=$row['title']; 
  $url=$row['url']; 

  $posts[] = array('title'=> $title, 'url'=> $url);
} 

$response['posts'] = $posts;

$fp = fopen('results.json', 'w');
fwrite($fp, json_encode($response));
fclose($fp);


?> 

1
Użyłem tego kodu w moim projekcie. Plik results.json działa dobrze na hoście lokalnym i nie działa na serwerze zdalnym. Czy możesz wyjaśnić, dlaczego tak ...
Vignesh Gopalakrishnan,

4
Fwrite można wyłączyć w ustawieniach serwera
Chris

chociaż jest to świetne, może dlatego, że używam teraz PHP 5 i nie było ono dostępne w momencie wysyłania tej odpowiedzi, ale możesz pozbyć się linii $ result = i wewnątrz pętli while po prostu utwórz mysql_feth_array ($ sql)

Zaktualizuj 1. wiersz do $ sql = "wybierz * z limitu postów 20"; , usuń mysql_query ()
Sachin Vairagi

6
fwrite($fp, json_encode($response,JSON_PRETTY_PRINT));- używa białych znaków do formatowania JSON. Inne stałe tutaj
Andrei Krasutski

49

Użyj tego:

$json_data = json_encode($posts);
file_put_contents('myfile.json', $json_data);

Musisz utworzyć plik myfile.json przed uruchomieniem skryptu.


W rzeczywistości w dniu komentowania nie ma potrzeby tworzenia pliku przed zapisaniem danych. Chociaż nadal musisz tworzyć nieistniejące podfoldery, jeśli takie istnieją, wzdłuż ścieżki zapisu. Oto oficjalny dokument dotyczący file_put_contents, dla wygody.
Valentine Shi

1
Tak, języki programowania ewoluują. Moja odpowiedź na post została opublikowana w 2017 r. Powinieneś był zamieścić nową odpowiedź ze zaktualizowanym sposobem robienia tego zamiast tylko obniżonego kodu, który działał w 2017
RileyManda

1
Nie ma zmiany w wyciętym, który podałeś. Po prostu file_put_contentsdziała sposób, o którym wspomniałem w moim wstępnym komentarzu.
Valentine Shi

30

Wstaw swoje pobrane wartości do tablicy zamiast powtarzać.

Użyj file_put_contents()i wstaw json_encode($rows)do tego pliku, jeśli $rowssą to twoje dane.


2
Widzę, że Twoja odpowiedź została opublikowana przed tą, która została najbardziej pozytywnie oceniona. Gdybyś tylko umieścił przykładowy kod, zdobyłbyś znacznie więcej głosów.
Engin Yapici

7

Tutaj wspomniałem o prostej składni do tworzenia pliku json i drukowania wartości tablicy w pliku json w ładny sposób.

$array = array('name' => $name,'id' => $id,'url' => $url);
$fp = fopen('results.json', 'w');
fwrite($fp, json_encode($array, JSON_PRETTY_PRINT));   // here it will print the array pretty
fclose($fp);

Mam nadzieję, że to zadziała ...




6

Jeśli pobierasz rekordy dynamiczne, lepiej mieć 1 plik php, który tworzy reprezentację json i nie tworzy pliku za każdym razem.

my_json.php

$array = array(
    'title' => $title,
    'url' => $url
);

echo stripslashes(json_encode($array)); 

Następnie w swoim skrypcie ustaw ścieżkę do pliku my_json.php


1
Kiedy próbuję to uruchomić za pomocą getJason, otrzymuję zasób interpretowany jako skrypt, ale przesyłany z tekstem / html typu MIME w konsoli.
kodowaniebbq

@noobcode Aby to naprawić, myślę, że powinieneś ustawić nagłówek „Content-Type” w swoim „my_json.php”.
katalin_2003

5

Najpierw musisz go zdekodować:

$jsonString = file_get_contents('jsonFile.json');
$data = json_decode($jsonString, true);

Następnie zmień dane:

$data[0]['activity_name'] = "TENNIS";
// or if you want to change all entries with activity_code "1"
foreach ($data as $key => $entry) {
    if ($entry['activity_code'] == '1') {
        $data[$key]['activity_name'] = "TENNIS";
    }
}

Następnie ponownie zakoduj go i zapisz z powrotem w pliku:

$newJsonString = json_encode($data);
file_put_contents('jsonFile.json', $newJsonString);

Kopiuj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.