12

我有一个导入 json 的简单文件:

主要的.ts

import json from './file.json'

但是,在导入 json 文件时,deno 会抛出以下错误:

$ deno run main.ts
Compile file:///home/path/to/project/main.ts
error: Uncaught TypeError: Cannot resolve extension for "file:///home/path/file.json" with mediaType "Json".
    at getExtension ($deno$/compiler.ts:218:13)
    at new SourceFile ($deno$/compiler.ts:263:22)
    at Function.addToCache ($deno$/compiler.ts:339:16)
    at processImports ($deno$/compiler.ts:743:31)
    at async processImports ($deno$/compiler.ts:753:7)
    at async compile ($deno$/compiler.ts:1316:31)
    at async tsCompilerOnMessage ($deno$/compiler.ts:1548:22)
    at async workerMessageRecvCallback ($deno$/runtime_worker.ts:74:9)

文件路径正确且文件是有效的 JSON。默认情况下,Typescript 编译器应该允许这样做

我还尝试明确启用resolveJsonModule

tsconfig.json

{
  "compilerOptions": {
    "resolveJsonModule": true
  },
  "include": [
    "**/*"
  ]
}

并使用配置运行它,但仍然得到相同的错误:

$ deno run main.ts --config=tsconfig.json
Compile file:///home/path/to/project/main.ts
error: Uncaught TypeError: Cannot resolve extension for "file:///home/path/file.json" with mediaType "Json".
    at getExtension ($deno$/compiler.ts:218:13)
    at new SourceFile ($deno$/compiler.ts:263:22)
    at Function.addToCache ($deno$/compiler.ts:339:16)
    at processImports ($deno$/compiler.ts:743:31)
    at async processImports ($deno$/compiler.ts:753:7)
    at async compile ($deno$/compiler.ts:1316:31)
    at async tsCompilerOnMessage ($deno$/compiler.ts:1548:22)
    at async workerMessageRecvCallback ($deno$/runtime_worker.ts:74:9)

这里有什么问题?

4

3 回答 3

22

根据以下线程对读取 json 文件的支持在发布 deno 1.0 之前被删除

https://github.com/denoland/deno/issues/5633

但是,您可以使用以下语法来读取 json 文件

Deno.readTextFile('./file.json').then(data => {
    console.log(JSON.parse(data))
})

或者

const data = JSON.parse(Deno.readTextFileSync('./file.json'));

另外,请确保运行包含上述代码的文件并带有--allow-read标志。否则你会得到一个权限被拒绝的错误

deno run --allow-read index.ts
于 2020-05-20T07:51:41.643 回答
15

作为 Afeef 答案的替代方案,由于JSON文件是有效的对象文字,您可以添加文件export default并将扩展名更改为.js.

来自settings.json

{
   "something": {
      "foo": "bar"
   } 
}

settings.js

export default {
   "something": {
      "foo": "bar"
   } 
}

现在你可以使用import

import settings from './settings.js'
console.log(typeof settings) // object
constole.log(settings.something.foo) // bar

除了更短之外,好处是您不需要--allow-read访问权限

于 2020-05-20T12:33:02.810 回答
7

从 Deno 1.17 开始,JSON 现在可以再次导入 ESM。现在必须使用导入断言:

import data from "./file.json" assert { type: "json" };
console.log(data);

有关更多信息,请参阅https://examples.deno.land/importing-json

于 2022-01-12T13:15:07.057 回答