Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

deno import JSON file as module

Tags:

json

module

deno

I have a simple file that imports a json:

main.ts

import json from './file.json'

However, deno throws the following error when importing a json file:

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

The file path is correct and the file is a valid JSON. The Typescript compiler should allow this by default.

I also tried to explicitly enable resolveJsonModule:

tsconfig.json

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

and run it with the config but still get the same error:

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

What's wrong here?

like image 646
Jankapunkt Avatar asked May 20 '20 07:05

Jankapunkt


People also ask

What is module in JSON?

This module contains functions for working with JSON data. You can use it to process JSON that is embedded in other file formats. For example, you can query JSON that is stored as lines in a large text file by using json:parse-as-xml with the text:collection function.

How do I import a JSON file into Ecmascript 6?

json" assert { type: "json" }; console. log(json. hello); // Dynamic Import const { default: json } = await import("./test. json", { assert: { type: "json" } }); console.


2 Answers

Since Deno 1.17 JSON can now once again be imported in ESM. Import assertions must now be used:

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

For more info, see https://examples.deno.land/importing-json.

like image 193
Luca Casonato Avatar answered Sep 28 '22 15:09

Luca Casonato


As per the following thread support for reading json files was removed just before shipping deno 1.0

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

However, you can use the following syntax for reading a json file

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

or

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

Also, be sure to run the file containing above code with --allow-read flag. Otherwise you will ge a permission denied error

deno run --allow-read index.ts
like image 38
Afeef Janjua Avatar answered Sep 28 '22 13:09

Afeef Janjua