mostrar leer formato externo ejemplos ejemplo datos create crear con archivo javascript jquery json firebug local-files

javascript - leer - Cargando archivo JSON local



leer json externo con javascript (21)

Estoy intentando cargar un archivo JSON local pero no funcionará. Aquí está mi código JavaScript (usando jQuery:

var json = $.getJSON("test.json"); var data = eval("(" +json.responseText + ")"); document.write(data["a"]);

El archivo test.json:

{"a" : "b", "c" : "d"}

No se muestra nada y Firebug me dice que los datos no están definidos. En Firebug puedo ver json.responseText y es bueno y válido, pero es extraño cuando copio la línea:

var data = eval("(" +json.responseText + ")");

En la consola de Firebug, funciona y puedo acceder a los datos.

¿Alguien tiene una solución?


De una manera más moderna, ahora puedes usar la API Fetch :

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

Todos los navegadores modernos soportan Fetch API. (Internet Explorer no lo hace, pero Edge lo hace!)

fuente:


En angular (o en cualquier otro marco), puedes cargar usando http get. Lo uso de esta forma:

this.http.get(<path_to_your_json_file)) .success((data) => console.log(data));

Espero que esto ayude.


Encontró este hilo al intentar (sin éxito) cargar un archivo json local. Esta solución funcionó para mí ...

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

... y se usa así ...

load_json("test2.html.js")

... y este es el <head> ...

<head> <script type="text/javascript" src="test.html.js" class="json"></script> </head>


Inténtelo de esta manera (pero también tenga en cuenta que JavaScript no tiene acceso al sistema de archivos del cliente):

$.getJSON(''test.json'', function(data) { console.log(data); });


Lo que funcionó para mí es lo siguiente:

Entrada:

http://ip_address//some_folder_name//render_output.html?relative/path/to/json/fie.json

Código 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, ''&amp;'').replace(/</g, ''&lt;'').replace(/>/g, ''&gt;''); 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>


Me sorprende que la importación desde es6 no haya sido mencionada (usar con archivos pequeños)

Ej: import test from ''./test.json''

webpack 2 <usa el json-loader como predeterminado para los archivos .json .

https://webpack.js.org/guides/migrating/#json-loader-is-not-required-anymore

Para TypeScript :

import test from ''json-loader!./test.json'';

TS2307 (TS) No se puede encontrar el módulo ''json-loader! ./ suburbs.json''

Para hacerlo funcionar tuve que declarar primero el módulo. Espero que esto ahorre unas horas para alguien.

declare module "json-loader!*" { let json: any; export default json; } ... import test from ''json-loader!./test.json'';

Si intenté omitir el loader de json-loader , recibí el siguiente error de webpack :

CAMBIO RÁPIDO: ya no se permite omitir el sufijo ''-loader'' cuando se usan cargadores. Debe especificar ''json-loader'' en lugar de ''json'', consulte https://webpack.js.org/guides/migrating/#automatic-loader-module-name-extension-removed


No he encontrado ninguna solución utilizando la biblioteca de cierre de Google. Así que solo para completar la lista para futuros visitantes, aquí se explica cómo cargar un JSON desde un archivo local con la biblioteca de cierre:

goog.net.XhrIo.send(''../appData.json'', function(evt) { var xhr = evt.target; var obj = xhr.getResponseJson(); //JSON parsed as Javascript object console.log(obj); });


No puedo creer cuántas veces se ha respondido a esta pregunta sin entender o abordar el problema con el código real del Póster original. Dicho esto, yo también soy un principiante (solo 2 meses de codificación). Mi código funciona perfectamente, pero no dude en sugerirle cambios. Aquí está la solución:

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

Aquí hay una forma más corta de escribir el mismo código que proporcioné anteriormente:

var json = JSON.parse($.getJSON({''url'': "http://spoonertuner.com/projects/test/test.json", ''async'': false}).responseText);

También puede usar $ .ajax en lugar de $ .getJSON para escribir el código exactamente de la misma manera:

var json = JSON.parse($.ajax({''url'': "http://spoonertuner.com/projects/test/test.json", ''async'': false}).responseText);

Finalmente, la última forma de hacerlo es envolver $ .ajax en una función. No puedo tomar crédito por esto, pero lo modifiqué un poco. Lo probé y funciona y produce los mismos resultados que mi código anterior. Encontré esta solución aquí -> cargar json en variable

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

El archivo test.json que ves en mi código anterior está alojado en mi servidor y contiene el mismo objeto de datos json que él (el póster original) había publicado.

{ "a" : "b", "c" : "d" }


Puedes poner tu json en un archivo javascript. Esto se puede cargar localmente (incluso en Chrome) usando la función getScript() jQuery.

archivo map-01.js:

var json = ''{"layers":6, "worldWidth":500, "worldHeight":400}''

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

salida:

world width: 500

Observe que la variable json está declarada y asignada en el archivo js.



Si desea que el usuario seleccione el archivo json local (en cualquier lugar del sistema de archivos), la siguiente solución funciona.

Utiliza usos FileReader y JSON.parser (y no 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>

Aquí hay una buena introducción a FileReader: http://www.html5rocks.com/en/tutorials/file/dndfiles/


Si está buscando algo rápido y sucio, simplemente cargue los datos en el encabezado de su documento HTML.

data.js

var DATA = {"a" : "b", "c" : "d"};

index.html

<html> <head> <script src="data.js" ></script> <script src="main.js" ></script> </head> ... </html>

main.js

(function(){ console.log(DATA) // {"a" : "b", "c" : "d"} })()


Si está utilizando una matriz local para JSON, como puede ver en su ejemplo en la pregunta (test.json), entonces puede parseJSON método parseJSON de JQuery ->

var obj = jQuery.parseJSON(''{"name":"John"}''); alert( obj.name === "John" );

getJSON se usa para obtener JSON desde un sitio remoto, no funcionará localmente (a menos que esté usando un servidor HTTP local)


Si tiene Python instalado en su máquina local (o no le importa instalar una), aquí hay una solución independiente del navegador para el problema de acceso al archivo JSON local que utilizo:

Transforme el archivo JSON en un JavaScript creando una función que devuelva los datos como objeto JavaScript. Luego puede cargarlo con la etiqueta <script> y llamar a la función para obtener los datos que desea.

Aquí viene el código de 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]'')



Un enfoque que me gusta usar es rellenar / envolver el json con un objeto literal, y luego guardar el archivo con una extensión de archivo .jsonp. Este método también deja inalterado el archivo json original (test.json), ya que trabajará con el nuevo archivo jsonp (test.jsonp). El nombre en el envoltorio puede ser cualquier cosa, pero debe ser el mismo nombre que la función de devolución de llamada que utiliza para procesar el jsonp. Usaré su test.json publicado como ejemplo para mostrar la adición del contenedor jsonp para el archivo ''test.jsonp''.

json_callback({"a" : "b", "c" : "d"});

A continuación, cree una variable reutilizable con alcance global en su script para mantener el JSON devuelto. Esto hará que los datos JSON devueltos estén disponibles para todas las demás funciones de su script en lugar de solo la función de devolución de llamada.

var myJSON;

Luego viene una función simple para recuperar su json mediante inyección de script. Tenga en cuenta que no podemos usar jQuery aquí para adjuntar el script al encabezado del documento, ya que IE no admite el método .append de jQuery. El método jQuery comentado en el siguiente código funcionará en otros navegadores que sí admiten el método .append. Se incluye como referencia para mostrar la diferencia.

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

La siguiente es una función de devolución de llamada breve y simple (con el mismo nombre que la envoltura jsonp) para obtener los datos de los resultados json en la variable global.

function json_callback(response){ myJSON = response; // Clone response JSON to myJSON object $(''#json_script'').remove(); // Remove json_script from the document }

Las funciones del script ahora pueden acceder a los datos json utilizando la notación de puntos. Como ejemplo:

console.log(myJSON.a); // Outputs ''b'' to console console.log(myJSON.c); // Outputs ''d'' to console

Este método puede ser un poco diferente de lo que está acostumbrado a ver, pero tiene muchas ventajas. Primero, el mismo archivo jsonp se puede cargar localmente o desde un servidor usando las mismas funciones. Como beneficio adicional, jsonp ya está en un formato compatible con varios dominios y también se puede usar fácilmente con API de tipo REST.

Por supuesto, no hay funciones de manejo de errores, pero ¿por qué necesitaría una? Si no puede obtener los datos json con este método, entonces puede apostar a que tiene algunos problemas dentro del mismo json, y lo verificaría en un buen validador JSON.


ace.webgeeker.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); }); }

Versión 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); }); }


$.getJSON es asíncrono, así que debes hacer:

$.getJSON("test.json", function(json) { console.log(json); // this will show the info it in firebug console });


json_str = String.raw`[{"name": "Jeeva"}, {"name": "Kumar"}]`; obj = JSON.parse(json_str); console.log(obj[0]["name"]);

Hice esto para mi aplicación cordova, como creé un nuevo archivo javascript para JSON y pegué los datos JSON en String.raw luego los JSON.parse con JSON.parse


$.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_); } }); } });


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

En primer lugar, lo que hice fue desde la pestaña de red, registrar el tráfico de red para el servicio y, desde el cuerpo de la respuesta, copiar y guardar el objeto json en un archivo local. Luego, llame a la función con el nombre del archivo local, debería poder ver el objeto json en jsonOutout arriba.