Как записать данные в файл JSON с помощью Javascript

Например, у меня есть файл .JSON который имеет следующее:

[{"honda": "accord", "color": "red"},{"ford": "focus", "color": "black"}]

Каким будет код javascript для {"nissan": "sentra", "color": "green"} другого объекта {"nissan": "sentra", "color": "green"} в этот массив .json чтобы сделать файл .json похожим на

[{"honda": "accord", "color": "red"},{"ford": "focus", "color": "black"},{"nissan": "sentra", "color": "green"}]

Причина, по которой я спрашиваю, состоит в том, что я нахожу в Интернете много информации о том, как извлекать данные из файла .json с помощью AJAX, но не записывает новые данные в файл .json с помощью AJAX для обновления файла .json дополнительными данными.

Любая помощь будет оценена!

Ответы

Ответ 1

Вы должны четко понимать, что вы подразумеваете под "JSON".

Некоторые люди неправильно используют термин JSON для ссылки на простой старый объект JavaScript, например [{a: 1}]. Этот случай оказывается массивом. Если вы хотите добавить новый элемент в массив, просто push он, как в

var arr = [{a: 1}];
arr.push({b: 2});

< [{a: 1}, {b: 2}]

Слово JSON также может использоваться для обозначения строки, которая кодируется в формате JSON:

var json = '[{"a": 1}]';

Обратите внимание на (одиночные) кавычки, указывающие, что это строка. Если у вас есть такая строка, которую вы получили откуда-то, вам нужно сначала разобрать ее в объект JavaScript, используя JSON.parse:

var obj = JSON.parse(json);

Теперь вы можете манипулировать объектом любым способом, включая push, как показано выше. Если вы хотите вернуть его в строку JSON, вы используете JSON.stringify:

var new_json = JSON.stringify(obj.push({b: 2}));
'[{"a": 1}, {"b": 1}]'

JSON также используется как общий способ форматирования данных для передачи данных на сервер и с сервера, где он может быть сохранен (сохранен). Здесь используется ajax. Ajax используется как для получения данных, часто в формате JSON, с сервера, так и для отправки данных в формате JSON до сервера. Если вы получили ответ от запроса ajax, который является форматом JSON, вам может понадобиться JSON.parse его, как описано выше. Затем вы можете манипулировать объектом, вернуть его в формат JSON с помощью JSON.stringify и использовать другой вызов ajax для отправки данных на сервер для хранения или других манипуляций.

Вы используете термин "файл JSON". Обычно слово "файл" используется для ссылки на физический файл на каком-либо устройстве ( не строка, с которой вы работаете в своем коде, или объект JavaScript). Браузер не имеет доступа к физическим файлам на вашем компьютере. Он не может их читать или писать. Собственно, браузер даже не имеет понятия "файл". Таким образом, вы не можете просто прочитать или написать какой-нибудь файл JSON на вашей локальной машине. Если вы отправляете JSON на сервер и с сервера, то, конечно, сервер может хранить JSON в качестве файла, но, скорее всего, сервер будет строить JSON на основе некоторого ajax-запроса на основе данных, которые он извлекает из базы данных, или декодирование JSON в некотором ajax-запросе, а затем сохранение соответствующих данных в свою базу данных.

У вас действительно есть "JSON файл", и если да, то где он существует и откуда вы его взяли? У вас есть строка в формате JSON, которая вам нужна для синтаксического анализа, mainpulate и возврата в новую строку формата JSON? Вам нужно получить JSON с сервера и изменить его, а затем отправить обратно на сервер? Или ваш "JSON файл" - это просто объект JavaScript, который вам просто нужно манипулировать с помощью обычной логики JavaScript?

Ответ 2

JSON можно записать в локальное хранилище, используя JSON.stringify для сериализации объекта JS. Вы не можете писать в файл JSON, используя только JS. Только файлы cookie или локальное хранилище

    var obj = {"nissan": "sentra", "color": "green"};

localStorage.setItem('myStorage', JSON.stringify(obj));

А для получения объекта позже

var obj = JSON.parse(localStorage.getItem('myStorage'));

Ответ 3

Вы также можете импортировать этот повторно используемый компонент write-json-file, который работает в этом примере:

const writeJsonFile = require('bit/global/write-json-file');
const jsonFile = "/tmp/exampleFile.json";
writeJsonFile(jsonFile,{isThisReal:ture,author:amit}).catch(err => console.log(err));

Код Src:

 const fs = require('fs');
    const vaildateJson = require('bit/global/json-validator');

    const writeToFile = (file,data) => {
      const jsonStr =  (data  instanceof Object) ? JSON.stringify(data,null,4) : data ;
      return vaildateJson(jsonStr)
        .then(jsonStr =>
          new Promise((resolve, reject) => {
            fs.writeFile(`${file}`, jsonStr, 'utf-8', function(err) {
              if (err) reject(err);
              else resolve(jsonStr);
            });
          }))
    }

    module.exports = function writeJsonFile(file, data) {
      return writeToFile(file,data)
    };

Вы также можете использовать этот пакет NPM для задания.

Ответ 4

К сожалению, сегодня (сентябрь 2018 года) вы не можете найти кросс-браузерное решение для записи файлов на стороне клиента.

Например: в некоторых браузерах, таких как Chrome, сегодня у нас есть такая возможность, и мы можем писать с помощью FileSystemFileEntry.createWriter() с помощью вызова на стороне клиента, но в соответствии с документом:

Эта функция устарела. Хотя он все еще может работать в некоторых браузерах, его использование не рекомендуется, поскольку его можно удалить в любое время. Старайтесь избегать его использования.


Для IE (но не для MS Edge) мы могли бы также использовать ActiveX, но это только для этого клиента.

Если вы хотите обновить кросс-браузер JSON файла, вы должны использовать серверную и клиентскую части вместе.

Скрипт на стороне клиента

На стороне клиента вы можете сделать запрос к серверу, а затем вы должны прочитать ответ от сервера. Или вы можете прочитать файл с FileReader тоже. Для кросс-браузерной записи в файл у вас должен быть какой-то сервер (см. Ниже о серверной части).

var xhr = new XMLHttpRequest(),
    jsonArr,
    method = "GET",
    jsonRequestURL = "SOME_PATH/jsonFile/";

xhr.open(method, jsonRequestURL, true);
xhr.onreadystatechange = function()
{
    if(xhr.readyState == 4 && xhr.status == 200)
    {
        // we convert your JSON into JavaScript object
        jsonArr = JSON.parse(xhr.responseText);

        // we add new value:
        jsonArr.push({"nissan": "sentra", "color": "green"});

        // we send with new request the updated JSON file to the server:
        xhr.open("POST", jsonRequestURL, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        // if you want to handle the POST response write (in this case you do not need it):
        // xhr.onreadystatechange = function(){ /* handle POST response */ };
        xhr.send("jsonTxt="+JSON.stringify(jsonArr));
        // but on this place you have to have a server for write updated JSON to the file
    }
};
xhr.send(null);

Серверные скрипты

Вы можете использовать много разных серверов, но я хотел бы написать о серверах PHP и Node.js.

С помощью поисковой машины вы можете найти " бесплатный веб-хостинг PHP *" или " бесплатный веб-хостинг Node.js ". Для сервера PHP я бы порекомендовал 000webhost.com, а для Node.js я бы порекомендовал посмотреть и прочитать этот список.

PHP скрипт на стороне сервера

Скрипт PHP для чтения и записи из файла JSON:

<?php

// This PHP script must be in "SOME_PATH/jsonFile/index.php"

$file = 'jsonFile.txt';

if($_SERVER['REQUEST_METHOD'] === 'POST')
// or if(!empty($_POST))
{
    file_put_contents($file, $_POST["jsonTxt"]);
    //may be some error handeling if you want
}
else if($_SERVER['REQUEST_METHOD'] === 'GET')
// or else if(!empty($_GET))
{
    echo file_get_contents($file);
    //may be some error handeling if you want
}
?>

Node.js серверное решение сценария

Я думаю, что Node.js немного сложен для начинающих. Это не обычный JavaScript, как в браузере. Прежде чем начать с Node.js, я бы рекомендовал прочитать одну из двух книг:

Скрипт Node.js для чтения и записи из файла JSON:

var http = require("http"),
    fs = require("fs"),
    port = 8080,
    pathToJSONFile = '/SOME_PATH/jsonFile.txt';

http.createServer(function(request, response)
{
    if(request.method == 'GET')
    {
        response.writeHead(200, {"Content-Type": "application/json"});
        response.write(fs.readFile(pathToJSONFile, 'utf8'));
        response.end();
    }
    else if(request.method == 'POST')
    {
        var body = [];

        request.on('data', function(chunk)
        {
            body.push(chunk);
        });

        request.on('end', function()
        {
            body = Buffer.concat(body).toString();
            var myJSONdata = body.split("=")[1];
            fs.writeFileSync(pathToJSONFile, myJSONdata); //default: 'utf8'
        });
    }
}).listen(port);

Ссылки по теме для Node.js: