Як читати зовнішній локальний файл JSON у JavaScript?


255

Я зберег файл JSON у своїй локальній системі та створив файл JavaScript, щоб прочитати файл JSON та роздрукувати дані. Ось файл JSON:

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

Скажімо , це шлях до файлу JSON: /Users/Documents/workspace/test.json.

Чи може хто-небудь допомогти мені в написанні простого фрагмента коду, щоб прочитати файл JSON і надрукувати дані в JavaScript?


Відповіді:


93

Ви не можете здійснити виклик AJAX на локальний ресурс, оскільки запит здійснюється за допомогою HTTP.

Вирішення проблеми полягає у запуску локального веб-сервера, подачі файлу та виклику AJAX до localhost.

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

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


2
Чи можете ви підказати мені, як я можу запустити локальний сервер у цьому випадку? Що мені потрібно зробити для запуску локального сервера?
користувач2864315

2
Яке середовище ви використовуєте? Windows? Linux?
Кріс Пікфорд

25
Це справедливо лише для AJAX: під Chrome і за допомогою файлового 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
Marc

192

Для читання зовнішнього локального файлу 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);

Для отримання додаткової інформації дивіться цю посилання .


8
Це працює, якщо ви можете змінити файл або якщо файл не має належного JSON як його вмісту. Наприклад, вміст зразка data.jsonвище не проходить перевірку: jsonlint.com, оскільки це дійсно JavaScript. Якщо випасти з обгортання одиничних лапок, це перетворить його на чистий JavaScript.
Джейсон Аллер

3
Примітка: JSON.parse не підтримується в деяких старих браузерах (дивлячись на IE). Дивіться таблицю сумісності браузера MDN дляwindow.JSON .
Самнер Еванс

Не повинен JSON.parse (дані); не працює, оскільки дані - це рядок?
зателефонуйте мені

259
Це не правильна відповідь. Приклад у відповіді - не завантаження файлу json. Це насправді просто завантаження іншого файлу javascript, який зберігає якийсь жорсткий код json як змінну з назвою data. Якщо ви видалили рядкові лапки з json, data.json вам навіть не потрібно було б користуватися JSON.parse. Питання полягає в тому, як завантажити файл JSON, а не як жорсткий код JSON в інший файл JavaScript і потім завантажити його.
wuliwong

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);
});

Ця функція працює також для завантаження .htmlабо .txtфайлів, з допомогою перевизначення параметра типу пантоміми в "text/html", і "text/plain"т.д.


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зворотного дзвінка.
Ігнат

33

Якщо ви перебуваєте в Node.js або в браузері використовуєте Requ.js , ви можете просто зробити:

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

Зверніть увагу: файл завантажується один раз, наступні дзвінки використовуватимуть кеш.


2
Неправда! У Javascript немає вбудованої потреби

1
@PauliSudarshanTerho Thx, ти маєш рацію! До відповіді додано вимоги Node / requ.js.
musicformellons

29
  1. Спочатку створіть файл json. У цьому прикладі мій файл - слова.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: це змушує повернути не 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);

 }
 


звідки потрібно () взяти? мій браузер не може його знайти
shieldgenerator7

вимагає () вбудована функція. Використовуючи Require () ви можете включати модулі, які існують в окремих файлах. Основна функціональність вимагає, щоб він читав файл javascript, виконував файл, а потім переходив до повернення об'єкта експорту
Syed Ayesha Bebe

5

Ця відповідь не показує, як завантажувати файл за допомогою Vanilla Javascript, але як це зробити за допомогою Node .js
Amos Long

18

Використання API Fetch - це найпростіше рішення:

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);

9

Якщо ви використовуєте локальні файли, чому б не просто упакувати дані як js-об’єкт?

data.js

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

Ніяких XMLHttpRequests , ніякого розбору, просто використовувати MyData.resourceбезпосередньо


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 лише тоді, коли ви перебуваєте в режимі розробки своїм методом.
Діамант

Ти правий. Я лише відповів, розглядаючи це питання.
Serhan C.

6

Просто використовуйте $ .getJSON, а потім $ .each для ітерації пари Key / value. Приклад вмісту для файлу 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 запитати файл із сервера та прочитати його. Сервер отримає файл з локальної файлової системи та подасть його вам через Інтернет.


1

Мені сподобалось те, що Стано / Метар коментував вище. Я використовую його для читання .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);
 });

Все ще працює на 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, якщо у вас його ще немає.



-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>

-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>'
    });

-3

Отже, якщо ви плануєте перейти з "Apache Tomcat" для розміщення файлу JSON,

1> Після запуску сервера перевірте, чи працює ваш Apache Tomcat, перейшовши на цей URL: "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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.