Javascript 上传JSON文件并使用它

Javascript 上传JSON文件并使用它,javascript,Javascript,我如何上传一个JSON文件,点击我网页上的一个按钮,比如说“导入”,并使用它存储在一个变量中,以使用JavaScript进行更新 我已经浏览了其他帖子,但找不到任何答案 我使用以下函数保存JSON变量: function save(filename, data){ if(!data) { alert('error : No data') return; } if(typeof data === "object"){ da

我如何上传一个JSON文件,点击我网页上的一个按钮,比如说“导入”,并使用它存储在一个变量中,以使用JavaScript进行更新

我已经浏览了其他帖子,但找不到任何答案

我使用以下函数保存JSON变量:

function save(filename, data){

    if(!data) {
        alert('error : No data')
        return;
    }

    if(typeof data === "object"){
        data = JSON.stringify(data, undefined, 4)
    }

    var blob = new Blob([data], {type: 'text/json'}),
        e    = document.createEvent('MouseEvents'),
        a    = document.createElement('a')

    a.download = filename
    a.href = window.URL.createObjectURL(blob)
    a.dataset.downloadurl =  ['text/json', a.download, a.href].join(':')
    e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
    a.dispatchEvent(e)
 }
这是工作正常,它下载的文件点击另一个按钮说“出口”。
如何上传此文件并使此文件数据成为JSON变量?

如果没有服务器端代码,您最好的方法可能是提供一个
textarea
元素供用户复制/粘贴JSON,然后使用
JSON.parse
解析它

您甚至可以使用类似于为JSON提供语法高亮显示的功能—您可以在左上角的下拉列表中选择JSON


编辑: 结果证明我错了。下面是一个演示正在使用的FileReader的提琴,这正是您所需要的:

代码如下:

Javascript:

document.getElementById('import').onclick = function() {
    var files = document.getElementById('selectFiles').files;
  console.log(files);
  if (files.length <= 0) {
    return false;
  }

  var fr = new FileReader();

  fr.onload = function(e) { 
  console.log(e);
    var result = JSON.parse(e.target.result);
    var formatted = JSON.stringify(result, null, 2);
        document.getElementById('result').value = formatted;
  }

  fr.readAsText(files.item(0));
};
<input type="file" id="selectFiles" value="Import" /><br />
<button id="import">Import</button>
<textarea id="result"></textarea>
document.getElementById('import')。onclick=function(){
var files=document.getElementById('selectFiles').files;
console.log(文件);

如果(files.length我找到了使用上传的json文件的方法,下面是我找到的方法

$("#inputFile").change(function(e) {
    onChange(e);
});

function onChange(event) {
    var reader = new FileReader();
    reader.onload = onReaderLoad;
    reader.readAsText(event.target.files[0]);
}

function onReaderLoad(event){
    //alert(event.target.result);
    var obj = JSON.parse(event.target.result);
    alert(obj);
}

基本上传文件

    <input id="contentFile" type="file" accept="application/json" />

您可能需要添加可拖动选项

首先创建你的HTML

<div class="drag" id="drag_area">
        <input class="box_file disabled" type="file" name="files[]" id="file" data-multiple-caption="{count} files selected" multiple />
        <label for="file"><strong>Choose save file</strong><span class="box__dragndrop"> or drag it here</span>.</label>
</div>

试试这个,效果很好

handleUploadFile = async(doc) => {
  let file = doc.target.files[0]
  let reader = new FileReader(file)

  // await reader.readAsDataURL(file)

  reader.readAsText(file)

  reader.onload = async(e) => {

    let aaa = e.target.result

    let content = await JSON.parse(aaa)
    console.log(content)

  }
}

我提出了一种更通用的方法,支持在加载完成时自定义上载按钮标题和回调:

函数上传JSON(id,回调){
document.getElementById(id).onchange=函数(evt){
试一试{
让files=evt.target.files;
如果(!files.length){
警报('未选择文件!');
返回;
}
让file=files[0];
let reader=new FileReader();
const self=这个;
reader.onload=(事件)=>{
回调(event.target.result);
};
reader.readAsText(文件);
}捕捉(错误){
控制台错误(err);
}
}
}
uploadJson('importJson',函数(json){
log(json);
});
导入json
[2021]基于承诺的方法 如前所述,您可以使用较新的blob api通过以下方式轻松获取文件的值:

await blob.text()
const getJsonUpload=()=>
新承诺(解决=>{
const inputFileElement=document.createElement('input')
inputFileElement.setAttribute('type','file')
inputFileElement.setAttribute('multiple','true')
inputFileElement.setAttribute('accept','.json')
inputFileElement.addEventListener(
"变",,
异步(事件)=>{
const{files}=event.target
如果(!文件){
返回
}
const filepromissions=[…files].map(file=>file.text())
解决(等待承诺。所有(文件承诺))
},
假,,
)
inputFileElement。单击()
})
document.getElementById('upload-button')。onclick=async()=>{
const jsonFiles=await getJsonUpload()
console.log({jsonFiles})
}

上传

没有服务器端代码吗?是的,没有服务器端代码。@PraveenKumara fiddle提供的会更好,因为有一个更新的、基于承诺的界面可以用来完成此任务:感谢仅json的有用属性:accept=“application/json”
$("#drag_area").on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {
    e.preventDefault();
    e.stopPropagation();
})
.on('dragover dragenter', function () {
    $("#drag_area").addClass('dr_active');
    // this is needed if you wish to style your drag area on drag events
})
.on('dragleave dragend drop', function () {
    $("#drag_area").removeClass('dr_active');
    // this is needed if you wish to style your drag area on drag events
})
.on('drop', function (e) {
    let droppedFiles = e.originalEvent.dataTransfer.files;
    let reader = new FileReader()
    reader.readAsDataURL(droppedFiles[0])
    reader.onloadend = function () {
    $.ajax({
        url: reader.result,
        success: function (data) {
          console.log(JSON.parse(data)); // This is your JSON
        },
        error: function (request, error) {
            cliLog(2, "Upload", "Cant upload save file")
        }
    });
}
}),
handleUploadFile = async(doc) => {
  let file = doc.target.files[0]
  let reader = new FileReader(file)

  // await reader.readAsDataURL(file)

  reader.readAsText(file)

  reader.onload = async(e) => {

    let aaa = e.target.result

    let content = await JSON.parse(aaa)
    console.log(content)

  }
}
await blob.text()