【问题标题】:Parsing selected file to array in Angular将所选文件解析为Angular中的数组
【发布时间】:2019-01-28 13:30:12
【问题描述】:

我正在尝试将选定的文件解析为 Angular 7 中的对象数组。

我选择文件的 HTML:

<div class="form-group" *ngIf="import">
  <label for="file">Choose backup file</label>
  <input type="file" id="file" (change)="handleFileInput($event.target.files)">
</div>

我已经能够使用此代码 sn-p 记录文件中的值:

fileToUpload: File = null;
handleFileInput(files: FileList) {
    this.fileToUpload = files.item(0);
    this.parseFile();
}

parseFile() {
  const fileReader = new FileReader();

  fileReader.onload = (e) => {
    console.log(fileReader.result);
  }

  fileReader.readAsText(this.fileToUpload);
}

该文件始终是一个包含如下对象数组的 json 文件:

[
    {"Test": "ValueA", "Value": "SomeStringA"},
    {"Test": "ValueB", "Value": "SomeStringB"},
    ...
]

我的目标是将以下对象反序列化为对象数组ObjectA[]

export interface ObjectA {
    Test: string;
    Value: string;
}

有人可以帮助我如何继续使用文件阅读器来实现这一目标吗?

在此先感谢

【问题讨论】:

    标签: angular typescript deserialization filereader


    【解决方案1】:

    JSON.parse() 接受一个字符串,解析它并返回一个对象。您可以使用它来解析您的文件。

    你可以这样做:

    async parseFile(): Promise<ObjectA[]> {
        const fileReader = new FileReader();
    
        return new Promise<ObjectA[]>((resolve) => {
            fileReader.onload = (e) => {
                resolve(JSON.parse(fileReader.result));
            }
    
            fileReader.readAsText(this.fileToUpload);
        });
    }
    

    当然,我的解决方案缺少错误处理,但你明白了要点。下面是一个工作代码 sn-p 演示我的解决方案(减去类型转换)。

    async function uploadFiles(files)  {
      for(const file of files) {
          const parsedObject = await parse(file);
          // Do stuff with your object
      }
    }
    
    async function parse(file) {
        const fileReader = new FileReader();
    
        return new Promise((resolve) => {
            fileReader.onload = (e) => {
                resolve(JSON.parse(fileReader.result));
            }
    
            fileReader.readAsText(file);
        });
    }
    <div>
        <input type="file" onchange="uploadFiles(this.files)" />
    </div>

    【讨论】:

    • 谢谢。您的解决方案不起作用,它缺乏必要条件if (typeof fileReader.result === 'string')
    • 正如我所提到的,我的解决方案缺乏错误处理。它不完全工作怎么办?我添加了一个工作代码 sn-p。
    • 这与我上面发布的代码完全相同,唯一的区别是使用 JSON.parse() 将其输出显示到 console.log
    • 您说您正在尝试将文件解析为对象。这正是我的方法所做的。我想我不太明白你的问题。 (当然,sn-p 是在 JavaScript 中的,因此没有打字,但之前的 sn-p 应该完全一样。)
    • 这段代码就像一个魅力。它在 Json 中解析您的输入字符串,然后 Promise 类型将其转换为“ObjectA”类型。这是使用此解决方案的 stackblitz:stackblitz.com/edit/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多