Как прочитать внешний локальный файл JSON в JavaScript?

255

Я сохранил файл JSON в своей локальной системе и создал файл JavaScript, чтобы прочитать файл JSON и распечатать данные. Вот файл JSON:

{"resource":"A","literals":["B","C","D"]}

Скажем , это путь к файлу JSON: /Users/Documents/workspace/test.json.

Может ли кто-нибудь помочь мне в написании простого кода для чтения файла JSON и печати данных в JavaScript?

user2864315
источник

Ответы:

93

Вы не можете сделать AJAX-вызов локальному ресурсу, так как запрос сделан с использованием HTTP.

Обходной путь - запустить локальный веб-сервер, обработать файл и выполнить AJAX-вызов localhost.

Чтобы помочь вам написать код для чтения JSON, вы должны прочитать документацию для jQuery.getJSON():

http://api.jquery.com/jQuery.getJSON/

Крис Пикфорд
источник
2
Не могли бы вы рассказать мне, как я могу запустить локальный сервер в этом случае? Что мне нужно сделать, чтобы запустить локальный сервер?
user2864315
2
Какую среду вы используете? Окна? Linux?
Крис Пикфорд
25
Это верно только для AJAX: под Chrome и с использованием File API HTML5 я уже сделал это. Вопрос не задавался по поводу AJAX.
Lauhub
10
Если у вас установлен Python, вы можете использовать командную строку python -m SimpleHTTPServer 8888и открыть http://localhost:8888/в браузере (Windows или Mac). 8888порт и может быть изменен
геотеория
3
Чтобы обновить комментарий @ geotheory, с Python 3 командаpython -m http.server 8888
Марк
193

Для чтения внешнего локального файла JSON (data.json) с помощью javascript сначала создайте файл data.json:

data = '[{"name" : "Ashwin", "age" : "20"},{"name" : "Abhinandan", "age" : "20"}]';
  1. Укажите путь к файлу json в источнике скрипта вместе с файлом javascript.

    <script type="text/javascript" src="data.json"></script>
    <script type="text/javascript" src="javascrip.js"></script>
  2. Получить объект из файла JSON

    var mydata = JSON.parse(data);
    alert(mydata[0].name);
    alert(mydata[0].age);
    alert(mydata[1].name);
    alert(mydata[1].age);

Для получения дополнительной информации см. Эту ссылку .

Ashfedy
источник
8
Это работает, если вы можете изменить файл, или если файл не имеет надлежащего JSON в качестве своего содержимого. Например, образец содержимого для data.jsonвыше не проходит проверку: jsonlint.com, потому что это действительно JavaScript. Отбрасывание одинарных кавычек превращает их в чистый JavaScript.
Джейсон Аллер
3
Примечание: JSON.parse не поддерживается в некоторых старых браузерах (глядя на вас IE). См . Таблицу совместимости браузера MDN дляwindow.JSON .
Самнер Эванс
Не должен JSON.parse (data); не работает, потому что данные являются строкой?
позвони мне
261
Это не правильный ответ. Пример в ответе не загружает файл json. На самом деле это просто загрузка другого файла javascript, который хранит некоторые жестко закодированные json как переменную с именем data. Если вы удалите строковые кавычки вокруг json, data.json вам даже не нужно будет их использовать JSON.parse. Вопрос в том, как загрузить файл JSON, а не в том, как жестко закодировать JSON в другой файл javascript, а затем загрузить его.
Вуливонг
1
JSON.parse(window.data);даст лучшую информацию scopeо dataпеременной.
Акаш
126

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

function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/json");
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            callback(rawFile.responseText);
        }
    }
    rawFile.send(null);
}

//usage:
readTextFile("/Users/Documents/workspace/test.json", function(text){
    var data = JSON.parse(text);
    console.log(data);
});

Эта функция также работает для загрузки файлов a .htmlили .txt, переопределяя параметр mime type на "text/html"и "text/plain"т. Д.

Stano
источник
14
Это очень плохая практика! В Google Chrome вы не можете сделать XmlHttpRequest на локальный ресурс.
mhaseeb
11
@mhaseeb Вы можете (даже сейчас, в будущем), если ресурс имеет тот же домен / протокол, что и запрашивающая система (что и будет, поскольку он локальный). Посмотрите CORS.
GreySage
11
при попытке сделать это с текущим Chrome, я получаю «Запросы перекрестного происхождения поддерживаются только для схем протоколов: http, data, chrome, chrome-extension, https». - так нет файла протокола, который здесь подразумевается @GreySage
eis
2
XMLHttpRequest.status возвращает числовое значение. Это работает только потому, что javascript работает в фоновом режиме, чтобы ваш код не умер. Должно читаться следующим образом: rawFile.status === 200
user3044394
1
Вы также можете установить rawFile.responseType = 'json';так, чтобы он автоматически анализировал объект json, просто передайте rawFile.responseвместо rawFile.responseTextобратного вызова.
Игнат
34

когда в Node.js или при использовании require.js в браузере , вы можете просто сделать:

let json = require('/Users/Documents/workspace/test.json');

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

musicformellons
источник
2
Не правда! Javascript не требует встроенных
1
@PauliSudarshanTerho Спасибо, ты прав! Добавил требования Node / require.js к ответу.
musicformellons
29
  1. Сначала создайте файл JSON. В этом примере мой файл - words.json

[{"name":"ay","id":"533"},
{"name":"kiy","id":"33"},
{"name":"iy","id":"33"},
{"name":"iy","id":"3"},
{"name":"kiy","id":"35"},
{"name":"kiy","id":"34"}]

  1. А вот мой код, то есть, node.js. Обратите внимание на 'utf8'аргумент readFileSync: это заставляет его возвращать не a Buffer(хотя JSON.parseможет с этим справиться), а строку. Я создаю сервер, чтобы увидеть результат ...

var fs=require('fs');
var data=fs.readFileSync('words.json', 'utf8');
var words=JSON.parse(data);
var bodyparser=require('body-parser');
console.log(words);
var express=require('express');

var app=express();

var server=app.listen(3030,listening);

function listening(){
console.log("listening..");
}
app.use(express.static('website'));
app.use(bodyparser.urlencoded({extended:false}));
app.use(bodyparser.json());

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

 app.get('/get/:id',function(req,res){
	
var i;
		 
 for(i=0;i<words.length;++i)
 {
 if(words[i].id==req.params.id){
 res.send(words[i]);
 }
}
console.log("success");
	  
});

  1. Когда вы ввели в URL, как localhost:3030/get/33он даст подробности, связанные с этим идентификатором .... и вы также читаете по имени. В моем файле json есть схожие имена с этим кодом, вы можете получить одно имя детали .... и он не распечатал все схожие имена

 app.get('/get/:name',function(req,res){
	
var i;
		 
 for(i=0;i<words.length;++i)
 {
 if(words[i].id==req.params.name){
 res.send(words[i]);
 }
}
console.log("success");
	  
});

  1. И если вы хотите прочитать подробности об имени симиллара, вы можете использовать этот код.

app.get('/get/name/:name',function(req,res){
word = words.filter(function(val){
  return val.name === req.params.name;
});
res.send(word);
			 
 console.log("success");
	  
});

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

app.get('/all',sendAll);
 
 function sendAll(request,response){
 response.send(words);

 }
 

Сайед Айеша Бебе
источник
откуда берется require ()? мой браузер не может его найти
shieldgenerator7
require () - встроенная функция. С помощью require () вы можете включать модули, которые существуют в отдельных файлах. Основная функция require заключается в том, что он читает файл javascript, выполняет файл и затем возвращает объект экспорта
Syed Ayesha Bebe
5
require () встроен в Node.js, он не является частью нативного js
dementis
Этот ответ не показывает, как загрузить файл с использованием Vanilla Javascript, но как это сделать с помощью Node .js
Amos Long
18

Использование Fetch API является самым простым решением:

fetch("test.json")
  .then(response => response.json())
  .then(json => console.log(json));

Он отлично работает в Firefox, но в Chrome вам нужно настроить параметры безопасности.

Алекс Глинский
источник
Когда я попробую это, я получил следующую ошибку: (узел: 2065) UnhandledPromiseRejectionWarning: Ошибка: поддерживаются только абсолютные URL-адреса
Jangid
13


Как уже упоминалось много людей, это не работает с использованием вызова AJAX. Тем не менее, есть способ обойти это. Используя элемент ввода, вы можете выбрать свой файл.

Выбранный файл (.json) должен иметь следующую структуру:

[
    {"key": "value"},
    {"key2": "value2"},
    ...
    {"keyn": "valuen"},
]


<input type="file" id="get_the_file">

Затем вы можете прочитать файл, используя JS с FileReader ():

document.getElementById("get_the_file").addEventListener("change", function() {
  var file_to_read = document.getElementById("get_the_file").files[0];
  var fileread = new FileReader();
  fileread.onload = function(e) {
    var content = e.target.result;
    // console.log(content);
    var intern = JSON.parse(content); // Array of Objects.
    console.log(intern); // You can index every object
  };
  fileread.readAsText(file_to_read);
});
Сара Кросс
источник
где вы указали имя вашего файла?
shieldgenerator7
1
В этом случае пользователь должен выбрать файл самостоятельно из-за политики CORS, которая в основном не позволяет разработчику веб-страницы получать данные, которые они не должны (например, я мог бы взять их личные файлы, я мог бы сделать ПОЛУЧИТЕ запрос к потенциально плохому сценарию и запустите его без разрешения пользователя). Политика CORS делает такие вещи мучительными без какой-либо серверной части, но делает пользователя более безопасным. Если вы действительно хотите открыть файл, вам нужно запустить веб-сервер, который может управлять этими запросами.
Сара Кросс
12

В зависимости от вашего браузера, вы можете получить доступ к вашим локальным файлам. Но это может не работать для всех пользователей вашего приложения.

Для этого вы можете воспользоваться инструкциями здесь: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Как только ваш файл загружен, вы можете получить данные, используя:

var jsonData = JSON.parse(theTextContentOfMyFile);
lauhub
источник
9

Если вы используете локальные файлы, почему бы просто не упаковать данные как объект js?

data.js

MyData = { resource:"A",literals:["B","C","D"]}

Нет XMLHttpRequests , нет парсинга, просто используйте MyData.resourceнапрямую

user7394313
источник
1
Хорошо, но не могли бы вы заполнить часть MyData.resource для javascript, чтобы показать его использование, чтобы быть более понятным. Спасибо.
Залив
9

Очень просто.
Переименуйте файл json в «.js» вместо «.json».

<script type="text/javascript" src="my_json.js"></script>

Так что следуйте вашему коду нормально.

<script type="text/javascript">
var obj = JSON.parse(contacts);

Тем не менее, только для информации, содержание моего JSON это выглядит как фрагмент ниже.

contacts='[{"name":"bla bla", "email":bla bla, "address":"bla bla"}]';
Антонио Карлос Дель Гранде Джуни
источник
4
это не файл JSON - это файл JS.
Карпик
9

Вы можете импортировать его как модуль ES6;

import data from "/Users/Documents/workspace/test.json"
Серхан С.
источник
Тогда как вы можете импортировать динамический файл JSON? Я думаю, что вы можете импортировать файлы JSON только тогда, когда вы находитесь в режиме разработки по вашему методу.
Даймонд
Ты прав. Я ответил только на этот вопрос.
Серхан С.
6

Просто используйте $ .getJSON, а затем $ .each для итерации пары ключ / значение. Пример содержимого файла JSON и функционального кода:

    {
        {
            "key": "INFO",
            "value": "This is an example."
        }
    }

    var url = "file.json";         
    $.getJSON(url, function (data) {
        $.each(data, function (key, model) {
            if (model.key == "INFO") {
                console.log(model.value)
            }
        })
    });
Хуан Карлос Авилес Ласкано
источник
3

Вы можете использовать метод XMLHttpRequest ():

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var myObj = JSON.parse(this.responseText);
        //console.log("Json parsed data is: " + JSON.stringify(myObj));
       }
    };
xmlhttp.open("GET", "your_file_name.json", true);
xmlhttp.send();

Вы можете увидеть ответ myObj с помощью оператора console.log (закомментировано).

Если вы знаете AngularJS, вы можете использовать $ http:

MyController.$inject = ['myService'];
function MyController(myService){

var promise = myService.getJsonFileContents();

  promise.then(function (response) {
    var results = response.data;
    console.log("The JSON response is: " + JSON.stringify(results));
})
  .catch(function (error) {
    console.log("Something went wrong.");
  });
}

myService.$inject = ['$http'];
function myService($http){

var service = this;

  service.getJsonFileContents = function () {
    var response = $http({
      method: "GET",
      url: ("your_file_name.json")
    });

    return response;
  };
}

Если файл находится в другой папке, укажите полный путь вместо имени файла.

Махарши Равал
источник
2

Поскольку у вас есть веб-приложение, у вас могут быть клиент и сервер.

Если у вас есть только ваш браузер, и вы хотите прочитать локальный файл из JavaScript, который работает в вашем браузере, это означает, что у вас есть только клиент. По соображениям безопасности браузер не должен позволять вам делать такие вещи.

Однако, как объяснял выше lauhub, похоже, что это работает:

http://www.html5rocks.com/en/tutorials/file/dndfiles/

Другое решение состоит в том, чтобы установить где-нибудь на вашей машине веб-сервер (крошечный в Windows или обезьяну в Linux) и с помощью библиотеки XMLHttpRequest или D3 запросить файл с сервера и прочитать его. Сервер извлечет файл из локальной файловой системы и предоставит его вам через Интернет.

Antoni
источник
1

Мне понравилось то, что Stano / Meetar прокомментировал выше. Я использую его для чтения файлов .json. Я расширил их примеры, используя Promise. Вот плункер для того же. https://plnkr.co/edit/PaNhe1XizWZ7C0r3ZVQx?p=preview

function readTextFile(file, callback) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/json");
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            callback(rawFile.responseText);
        }
    }
    rawFile.send(null);
}

//usage:
// readTextFile("DATA.json", function(text){
//     var data = JSON.parse(text);
//     console.log(data); 
// });


var task1 = function (){
  return new Promise (function(resolve, reject){
    readTextFile("DATA.json", function(text){
    var data = JSON.parse(text);
    console.log('task1 called');
    console.log(data);
    resolve('task1 came back');
    }); 
  });
};

var task2 = function (){
  return new Promise (function(resolve, reject){
    readTextFile("DATA2.json", function(text){
    var data2 = JSON.parse(text);
    console.log('task2 called');
    console.log(data2);
    resolve('task2 came back');
    });
  });
}

Promise.race([task1(), task2()])
       .then(function(fromResolve){
          console.log(fromResolve); 
       });

Чтение JSON можно перенести в другую функцию, для DRY; но пример здесь больше демонстрирует, как использовать обещания.

планктон
источник
1

Вы должны создать новый экземпляр XMLHttpRequest и загрузить содержимое файла json.

Этот совет работает для меня ( https://codepen.io/KryptoniteDove/post/load-json-file-locally-using-pure-javascript ):

 function loadJSON(callback) {   

    var xobj = new XMLHttpRequest();
        xobj.overrideMimeType("application/json");
    xobj.open('GET', 'my_data.json', true); // Replace 'my_data' with the path to your file
    xobj.onreadystatechange = function () {
          if (xobj.readyState == 4 && xobj.status == "200") {
            // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode
            callback(xobj.responseText);
          }
    };
    xobj.send(null);  
 }

 loadJSON(function(response) {
    // Parse JSON string into object
    var actual_JSON = JSON.parse(response);
 });
rodrigomelo
источник
Тем не менее работает на Firefox , но не на Chrome: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https. Вы можете использовать json2js для преобразования любого файла JSON в .JS.
lalengua
1

Один простой обходной путь - поместить ваш файл JSON на локально работающий сервер. для этого из терминала перейдите в папку вашего проекта и запустите локальный сервер на некотором номере порта, например, 8181

python -m SimpleHTTPServer 8181

Затем, перейдя по адресу http: // localhost: 8181 /, должны отобразиться все ваши файлы, включая JSON. Не забудьте установить Python, если у вас его еще нет.

ewalel
источник
0

Если бы вы могли запустить локальный веб-сервер (как предложил Крис Р выше) и если вы могли бы использовать jQuery, вы можете попробовать http://api.jquery.com/jQuery.getJSON/

Николае Олариу
источник
-1

Вы можете использовать D3 для обработки обратного вызова и загрузить локальный файл JSON data.jsonследующим образом:

<script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>

<script>
  d3.json("data.json", function(error, data) {
    if (error)
      throw error;
    console.log(data);
  });
</script>
AlexG
источник
-2

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

// wrapped XMLHttpRequest in a promise
const readFileP = (file, options = {method:'get'}) => 
  new Promise((resolve, reject) => {
    let request = new XMLHttpRequest();
    request.onload = resolve;
    request.onerror = reject;
    request.overrideMimeType("application/json");
    request.open(options.method, file, true);
    request.onreadystatechange = () => {
        if (request.readyState === 4 && request.status === "200") {
            resolve(request.responseText);
        }
    };
    request.send(null);
});

Вы можете назвать это так:

readFileP('<path to file>')
    .then(d => {
      '<do something with the response data in d.srcElement.response>'
    });
ewilan
источник
-4

Итак, если вы планируете использовать Apache Tomcat для размещения вашего JSON-файла,

1> После запуска сервера убедитесь, что ваш Apache Tomcat запущен и работает, перейдя по этому адресу: "localhost: 8080" -

введите описание изображения здесь



2> Затем перейдите в папку «webapps» - «C: \ Program Files \ Apache Software Foundation \ Tomcat 8.5 \ webapps». И создайте папку проекта или скопируйте папку проекта.

введите описание изображения здесь


3> Вставьте туда свой файл json. введите описание изображения здесь



4> И это все. Вы сделали! Просто зайдите на - " http: // localhost: 8080 / $ project_name $ / $ jsonFile_name $ .json"введите описание изображения здесь

Яш П Шах
источник
Не запрашивается сервер TomCat
Чандра Кант,