2011-10-25 30 views
6

Tôi có tập tin này .json mong muốn:dữ liệu Nối vào một tập tin .json với PHP

[ 
    { 
     "id": 1, 
     "title": "Ben\\'s First Blog Post", 
     "content": "This is the content" 
    }, 
    { 
     "id": 2, 
     "title": "Ben\\'s Second Blog Post", 
     "content": "This is the content" 
    } 
] 

tôi đang làm điều này với mã PHP này:

<?php 
$data[] = $_POST['data']; 

$fp = fopen('results.json', 'a'); 
fwrite($fp, json_encode($data)); 
fclose($fp); 

Có điều là, tôi m không chắc chắn chính xác chắc chắn làm thế nào để đạt được nó. Tôi sẽ gọi mã này ở trên mỗi lần gửi biểu mẫu, vì vậy tôi cần ID để tăng và cũng giữ cấu trúc JSON hợp lệ với [và {, điều này có thể không?

+4

Tôi không nghĩ JSON là định dạng gia tăng; bạn sẽ phải deserialise nó, thêm hồ sơ mới của bạn, và serialise nó một lần nữa. – Neil

+1

Tôi biết nó không phải là câu trả lời cho câu hỏi của bạn, nhưng điều này làm tôi nhớ đến một thời gian tôi đã cố gắng làm điều tương tự với XML. Mục đích là lưu trữ các bài đăng trên blog và tôi nghĩ rằng đó sẽ là một cách hay để tránh cần MySQL. Tuy nhiên, Điều này đã không xảy ra. Đó là đáng tin cậy hơn, thực hành tốt hơn, và cách ít đau đớn trong thời gian dài, để sử dụng một cơ sở dữ liệu chứ không phải là một tập tin cho loại dữ liệu. Tôi xin lỗi, tôi biết nó cực kỳ khó chịu khi bạn đặt câu hỏi và ai đó đưa ra "không làm điều đó" như một câu trả lời (đó là lý do tại sao tôi đăng bài này làm bình luận). Nó chỉ là những gì tôi muốn tôi được nói sớm hơn. –

+0

dữ liệu Nối vào một tập tin .json [nhập liên kết mô tả ở đây] [1] [1]: http://stackoverflow.com/questions/12290572/appending-to-json-file-in-javascript –

Trả lời

28
$data[] = $_POST['data']; 

$inp = file_get_contents('results.json'); 
$tempArray = json_decode($inp); 
array_push($tempArray, $data); 
$jsonData = json_encode($tempArray); 
file_put_contents('results.json', $jsonData); 
+15

Sẽ không mất nhiều thời gian hơn để làm mọi lúc? Nó không thể nhận được khá vô lý khi bạn có một tập tin JSON HUGE? Tôi đang xử lý rất nhiều dữ liệu. – Goahnary

+0

newbie php guy here ...làm cách nào để sửa đổi câu trả lời ở trên để hoạt động nếu tôi nhận được "dữ liệu bài đăng" bằng cách sử dụng file_get_contents ('php: // input')? Vì vậy, về cơ bản dòng đầu tiên không làm việc cho tôi. Tôi đang sử dụng file_get_contents ('php: // input') vì tôi đang gọi hàm fetch() trong JS để tạo bài đăng http. –

12

Bạn đang hủy hoại dữ liệu json của mình bằng cách thêm văn bản vào đó một cách mù quáng. JSON không phải là một định dạng có thể được thao tác như thế này.

Bạn sẽ phải tải văn bản json, giải mã, thao tác cấu trúc dữ liệu kết quả, sau đó mã hóa lại/lưu nó.

<?php 

$json = file_get_contents('results.json'); 
$data = json_decode($json); 
$data[] = $_POST['data']; 
file_put_contents('results.json', json_encode($data)); 

Giả sử bạn đã lưu trữ [1,2,3] trong tệp của mình. Mã của bạn có thể biến điều đó thành [1,2,3]4, lỗi cú pháp.

4

Nếu bạn muốn thêm phần tử mảng khác vào tệp JSON làm ví dụ của bạn, hãy mở tệp và tìm đến cuối. Nếu tệp đã có dữ liệu, tìm ngược lại một byte để ghi đè "]" sau mục nhập cuối cùng, sau đó ghi "," cộng với dữ liệu mới trừ đi "[" đầu tiên của dữ liệu mới. Nếu không, đó là phần tử mảng đầu tiên của bạn, do đó, chỉ cần viết mảng của bạn bình thường.

Xin lỗi tôi không biết đủ về PHP để gửi mã thực tế, nhưng tôi đã làm điều này trong obj-C và nó cho phép tôi để tránh đọc toàn bộ tập tin trong lần đầu tiên chỉ để thêm vào cuối cùng:

NSArray *array = @[myDictionary]; 
NSData *data = [NSJSONSerialization dataWithJSONObject:array options:0 error:nil]; 
FILE *fp = fopen(fname, "r+"); 
if (NULL == fp) 
    fp = fopen(fname, "w+"); 
if (fp) { 
    fseek(fp, 0L, SEEK_END); 
    if (ftell(fp) > 0) { 
     fseek(fp, -1L, SEEK_END); 
     fwrite(",", 1, 1, fp); 
     fwrite([data bytes] + 1, [data length] - 1, 1, fp); 
    } 
    else 
     fwrite([data bytes], [data length], 1, fp); 
    fclose(fp); 
} 
17

Điều này đã lấy ví dụ trên và chuyển nó sang php. Thao tác này sẽ chuyển đến cuối tệp và thêm dữ liệu mới mà không đọc tất cả tệp vào bộ nhớ.

// read the file if present 
$handle = @fopen($filename, 'r+'); 

// create the file if needed 
if ($handle === null) 
{ 
    $handle = fopen($filename, 'w+'); 
} 

if ($handle) 
{ 
    // seek to the end 
    fseek($handle, 0, SEEK_END); 

    // are we at the end of is the file empty 
    if (ftell($handle) > 0) 
    { 
     // move back a byte 
     fseek($handle, -1, SEEK_END); 

     // add the trailing comma 
     fwrite($handle, ',', 1); 

     // add the new json string 
     fwrite($handle, json_encode($event) . ']'); 
    } 
    else 
    { 
     // write the first event inside an array 
     fwrite($handle, json_encode(array($event))); 
    } 

     // close the handle on the file 
     fclose($handle); 
} 
3

Mã mẫu tôi đã sử dụng để nối thêm mảng JSON vào json.

   $AdditionalArray = array(
       'id' => $id, 
       'title' => $title, 
       'content' => $content 
       ); 

       //open or read json data 
       $data_results = file_get_contents('results.json'); 

       $tempArray = json_decode($data_results); 
       //append additional json to json file 
       $tempArray[]=$AdditionalArray; 
       $jsonData = json_encode($tempArray); 

      file_put_contents('results.json', $jsonData); 
Các vấn đề liên quan