Загрузка локального файла JSON
Я пытаюсь загрузить локальный файл JSON, но он не будет работать. Вот мой код JavaScript (с помощью jQuery:
var json = $.getJSON("test.json");
var data = eval("(" +json.responseText + ")");
document.write(data["a"]);
теста.JSON-файл:
{"a" : "b", "c" : "d"}
ничего не отображается, и Firebug говорит мне, что данные не определены. В Firebug я вижу json.responseText
и это хорошо и справедливо, но это странно, когда я копирую строку:
var data = eval("(" +json.responseText + ")");
в консоли Firebug, он работает и я могу получить доступ к данным.
у кого-нибудь есть решение?
21 ответ:
$.getJSON
является асинхронным, поэтому вы должны сделать:$.getJSON("test.json", function(json) { console.log(json); // this will show the info it in firebug console });
У меня была такая же потребность (чтобы проверить мое приложение angularjs), и единственный способ, который я нашел, это использовать require.js:
var json = require('./data.json'); //(with path)
Примечание: файл загружается один раз, дальнейшие вызовы будут использовать кэш.
подробнее о чтении файлов с помощью nodejs:http://docs.nodejitsu.com/articles/file-system/how-to-read-files-in-nodejs
требуют.js:http://requirejs.org/
Если вы хотите, чтобы пользователь выбрал локальный файл json (в любом месте файловой системы), то работает следующее решение.
он использует использует FileReader и JSON.парсер (и без jquery).
<html> <body> <form id="jsonFile" name="jsonFile" enctype="multipart/form-data" method="post"> <fieldset> <h2>Json File</h2> <input type='file' id='fileinput'> <input type='button' id='btnLoad' value='Load' onclick='loadFile();'> </fieldset> </form> <script type="text/javascript"> function loadFile() { var input, file, fr; if (typeof window.FileReader !== 'function') { alert("The file API isn't supported on this browser yet."); return; } input = document.getElementById('fileinput'); if (!input) { alert("Um, couldn't find the fileinput element."); } else if (!input.files) { alert("This browser doesn't seem to support the `files` property of file inputs."); } else if (!input.files[0]) { alert("Please select a file before clicking 'Load'"); } else { file = input.files[0]; fr = new FileReader(); fr.onload = receivedText; fr.readAsText(file); } function receivedText(e) { let lines = e.target.result; var newArr = JSON.parse(lines); } } </script> </body> </html>
вот хорошее введение в FileReader:http://www.html5rocks.com/en/tutorials/file/dndfiles/
Если вы ищете что-то быстрое и грязное, просто загрузите данные в голову вашего HTML-документа.
данные.js
.HTML-кодvar DATA = {"a" : "b", "c" : "d"};
<html> <head> <script src="data.js" ></script> <script src="main.js" ></script> </head> ... </html>
главная.js
(function(){ console.log(DATA) // {"a" : "b", "c" : "d"} })()
в более современном виде, теперь вы можете использовать Fetch API:
fetch("test.json") .then(response => response.json()) .then(json => console.log(json));
все современные браузеры поддерживают Fetch API. (Internet Explorer этого не делает, но Edge делает!)
источник:
туз.вебгикер.xyz
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); } function init() { loadJSON(function(response) { // Parse JSON string into object var actual_JSON = JSON.parse(response); }); }
версия ES6
const loadJSON = (callback) => { let 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 = () => { 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); } const init = () => { loadJSON((response) => { // Parse JSON string into object let actual_JSON = JSON.parse(response); }); }
попробуйте такой способ (но также обратите внимание, что JavaScript не имеет доступа к клиентской файловой системе):
$.getJSON('test.json', function(data) { console.log(data); });
недавно D3js может обрабатывать локальный файл json.
вот в чем проблема https://github.com/mbostock/d3/issues/673
Это патч inorder для D3 для работы с локальными файлами json. https://github.com/mbostock/d3/pull/632
Я не могу поверить, сколько раз на этот вопрос был дан ответ без понимания и/или решения проблемы с фактическим кодом оригинального плаката. Тем не менее, я сам новичок (только 2 месяца кодирования). Мой код работает отлично, но не стесняйтесь предлагать любые изменения к нему. вот решение:
//include the 'async':false parameter or the object data won't get captured when loading var json = $.getJSON({'url': "http://spoonertuner.com/projects/test/test.json", 'async': false}); //The next line of code will filter out all the unwanted data from the object. json = JSON.parse(json.responseText); //You can now access the json variable's object data like this json.a and json.c document.write(json.a); console.log(json);
вот более короткий способ написания того же кода, который я предоставил выше:
var json = JSON.parse($.getJSON({'url': "http://spoonertuner.com/projects/test/test.json", 'async': false}).responseText);
вы также можете использовать $.вместо Ajax в $.помощью метода getjson, чтобы писать код точно так же:
var json = JSON.parse($.ajax({'url': "http://spoonertuner.com/projects/test/test.json", 'async': false}).responseText);
наконец, последний способ сделать это обернуть $.ajax в функции. Я не могу взять на себя ответственность за это, но я немного изменил его. Я протестировал его, и он работает и дает те же результаты, что и мой код выше. Я нашел это решение здесь --> загрузить json в переменную
var json = function () { var jsonTemp = null; $.ajax({ 'async': false, 'url': "http://spoonertuner.com/projects/test/test.json", 'success': function (data) { jsonTemp = data; } }); return jsonTemp; }(); document.write(json.a); console.log(json);
The
Я удивлен, что импорт из es6 не был упомянут (используйте с небольшими файлами)
пример:
import test from './test.json'
webpack 2json-loader по умолчанию для
.json
файлы.https://webpack.js.org/guides/migrating/#json-loader-is-not-required-anymore
на TypeScript:
import test from 'json-loader!./test.json';
TS2307 (TS) не удается найти модуль 'JSON-loader!./пригородная зона.json'
чтобы получить его работая, я должен был сначала объявить модуль. Я надеюсь, что это сэкономит несколько часов для кого-то.
declare module "json-loader!*" { let json: any; export default json; } ... import test from 'json-loader!./test.json';
если бы я попытался опустить
loader
Сjson-loader
я получил следующую ошибку отwebpack
:BREAKING CHANGE: больше не разрешается опускать суффикс '-loader' при использовании погрузчиков. Вам нужно указать 'JSON-loader' вместо 'json', видеть https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed
нашел этот поток при попытке (безуспешно) загрузить локальный файл json. Это решение сработало для меня...
function load_json(src) { var head = document.getElementsByTagName('head')[0]; //use class, as we can't reference by id var element = head.getElementsByClassName("json")[0]; try { element.parentNode.removeChild(element); } catch (e) { // } var script = document.createElement('script'); script.type = 'text/javascript'; script.src = src; script.className = "json"; script.async = false; head.appendChild(script); //call the postload function after a slight delay to allow the json to load window.setTimeout(postloadfunction, 100) }
... и используется вот так...
load_json("test2.html.js")
...и это
<head>
...<head> <script type="text/javascript" src="test.html.js" class="json"></script> </head>
в angular (или любой другой фреймворк), вы можете загрузить с помощью http get Я использую его примерно так:
this.http.get(<path_to_your_json_file)) .success((data) => console.log(data));
надеюсь, что это помогает.
$.ajax({ url: "Scripts/testingJSON.json", //force to handle it as text dataType: "text", success: function (dataTest) { //data downloaded so we call parseJSON function //and pass downloaded data var json = $.parseJSON(dataTest); //now json variable contains data in json format //let's display a few items $.each(json, function (i, jsonObjectList) { for (var index = 0; index < jsonObjectList.listValue_.length;index++) { alert(jsonObjectList.listKey_[index][0] + " -- " + jsonObjectList.listValue_[index].description_); } }); } });
Если вы используете локальный массив для JSON-как вы показали в своем exmaple в вопросе (тест.json) тогда вы можете это
parseJSON
метод JQuery ->var obj = jQuery.parseJSON('{"name":"John"}'); alert( obj.name === "John" );
getJSON
используется для получения JSON с удаленного сайта - он не будет работать локально (если вы не используете локальный сервер HTTP)
json_str = String.raw`[{"name": "Jeeva"}, {"name": "Kumar"}]`; obj = JSON.parse(json_str); console.log(obj[0]["name"]);
Я сделал это для моего приложения cordova, как я создал новый файл javascript для JSON и вставил данные JSON в
String.raw
затем разобрать его сJSON.parse
Я не нашел никакого решения, используя библиотеку закрытия Google. Поэтому просто чтобы завершить список для будущих vistors, вот как вы загружаете JSON из локального файла с библиотекой закрытия:
goog.net.XhrIo.send('../appData.json', function(evt) { var xhr = evt.target; var obj = xhr.getResponseJson(); //JSON parsed as Javascript object console.log(obj); });
подход, который мне нравится использовать, заключается в том, чтобы поместить/обернуть json литералом объекта, а затем сохранить файл с помощью a .расширение файла jsonp. Этот метод также оставляет исходный файл json (test.json) без изменений, так как вы будете работать с новым файлом jsonp (test.jsonp) вместо этого. Имя на оболочке может быть любым, но оно должно быть тем же именем, что и функция обратного вызова, которую вы используете для обработки jsonp. Я воспользуюсь вашим тестом.json опубликовал в качестве примера, чтобы показать добавление оболочки jsonp для - тест.файл JSONP'.
json_callback({"a" : "b", "c" : "d"});
затем создайте повторно используемую переменную с глобальной областью действия в сценарии для хранения возвращенного JSON. Это сделает возвращенные данные JSON доступными для всех других функций в вашем скрипте, а не только для функции обратного вызова.
var myJSON;
Далее идет простая функция для получения вашего json путем инъекции скрипта. Обратите внимание, что мы не можем использовать jQuery здесь, чтобы добавить скрипт в голову документа, так как IE не поддерживает jQuery .метод append. Этот метод jQuery, закомментированный в приведенном ниже коде, будет работать на других браузерах, которые поддерживают его .метод append. Он включен в качестве ссылки, чтобы показать разницу.
function getLocalJSON(json_url){ var json_script = document.createElement('script'); json_script.type = 'text/javascript'; json_script.src = json_url; json_script.id = 'json_script'; document.getElementsByTagName('head')[0].appendChild(json_script); // $('head')[0].append(json_script); DOES NOT WORK in IE (.append method not supported) }
далее-это короткая и простая функция обратного вызова (с тем же именем, что и оболочка jsonp), чтобы получить данные результатов json в глобальную переменную.
function json_callback(response){ myJSON = response; // Clone response JSON to myJSON object $('#json_script').remove(); // Remove json_script from the document }
данные json теперь могут быть доступны любым функциям скрипта с использованием точечной нотации. В качестве примера:
console.log(myJSON.a); // Outputs 'b' to console console.log(myJSON.c); // Outputs 'd' to console
этот метод может быть, немного отличается от того, что вы привыкли видеть, но имеет много преимуществ. Во-первых, один и тот же файл jsonp можно загрузить локально или с сервера, используя те же функции. В качестве бонуса, jsonp уже находится в междоменном дружественном формате, а также может быть легко использован с API типа REST.
конечно, нет никаких функций обработки ошибок, но зачем вам это нужно? Если вы не можете получить данные json с помощью этого метода, то вы можете в значительной степени поспорить, что у вас есть некоторые проблемы внутри сам json, и я бы проверил его на хорошем валидаторе JSON.
вы можете поместить свой json в файл javascript. Это может быть загружено локально (даже в Chrome) с помощью jQuery .
карта-01.js file:
var json = '{"layers":6, "worldWidth":500, "worldHeight":400}'
главная.js
$.getScript('map-01.js') .done(function (script, textStatus) { var map = JSON.parse(json); //json is declared in the js file console.log("world width: " + map.worldWidth); drawMap(map); }) .fail(function (jqxhr, settings, exception) { console.log("error loading map: " + exception); });
выход:
world width: 500
обратите внимание, что переменная json объявлена и назначена в файле js.
function readTextFile(srcfile) { try { //this is for IE var fso = new ActiveXObject("Scripting.FileSystemObject");; if (fso.FileExists(srcfile)) { var fileReader = fso.OpenTextFile(srcfile, 1); var line = fileReader.ReadLine(); var jsonOutput = JSON.parse(line); } } catch (e) { } } readTextFile("C:\Users\someuser\json.txt");
то, что я сделал, было, прежде всего, на вкладке Сеть, записать сетевой трафик для службы, а из тела ответа, скопировать и сохранить объект json в локальном файле. Затем вызовите функцию с именем локального файла, вы должны быть в состоянии видеть объект json в jsonOutout выше.
что сработало для меня следующее:
вход:
http://ip_address//some_folder_name//render_output.html?relative/path/to/json/fie.json
Javascript Код:
<html> <head> <style> pre {} .string { color: green; } .number { color: darkorange; } .boolean { color: blue; } .null { color: magenta; } .key { color: red; } </style> <script> function output(inp) { document.body.appendChild(document.createElement('pre')).innerHTML = inp; } function gethtmlcontents(){ path = window.location.search.substr(1) var rawFile = new XMLHttpRequest(); var my_file = rawFile.open("GET", path, true) // Synchronous File Read //alert('Starting to read text') rawFile.onreadystatechange = function () { //alert("I am here"); if(rawFile.readyState === 4) { if(rawFile.status === 200 || rawFile.status == 0) { var allText = rawFile.responseText; //alert(allText) var json_format = JSON.stringify(JSON.parse(allText), null, 8) //output(json_format) output(syntaxHighlight(json_format)); } } } rawFile.send(null); } function syntaxHighlight(json) { json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); return json.replace(/("(\u[a-zA-Z0-9]{4}|\[^u]|[^\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { var cls = 'number'; if (/^"/.test(match)) { if (/:$/.test(match)) { cls = 'key'; } else { cls = 'string'; } } else if (/true|false/.test(match)) { cls = 'boolean'; } else if (/null/.test(match)) { cls = 'null'; } return '<span class="' + cls + '">' + match + '</span>'; }); } gethtmlcontents(); </script> </head> <body> </body> </html>
Если у Вас установлен Python на локальном компьютере (или вы не возражаете установить его), вот независимый от браузера обходной путь для локальной проблемы доступа к файлам JSON, которую я использую:
преобразуйте файл JSON в JavaScript, создав функцию, которая возвращает данные как объект JavaScript. Затем вы можете загрузить его с тегом
здесь идет Python-код
import json def json2js(jsonfilepath, functionname='getData'): """function converting json file to javascript file: json_data -> json_data.js :param jsonfilepath: path to json file :param functionname: name of javascript function which will return the data :return None """ # load json data with open(jsonfilepath,'r') as jsonfile: data = json.load(jsonfile) # write transformed javascript file with open(jsonfilepath+'.js', 'w') as jsfile: jsfile.write('function '+functionname+'(){return ') jsfile.write(json.dumps(data)) jsfile.write(';}') if __name__ == '__main__': from sys import argv l = len(argv) if l == 2: json2js(argv[1]) elif l == 3: json2js(argv[1], argv[2]) else: raise ValueError('Usage: python pathTo/json2js.py jsonfilepath [jsfunctionname]')