diff --git a/.github/workflows/versions.yml b/.github/workflows/versions.yml
index 1af0c125..9422a111 100644
--- a/.github/workflows/versions.yml
+++ b/.github/workflows/versions.yml
@@ -92,7 +92,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest]
-        node-version-file: [.nvmrc, .tool-versions]
+        node-version-file: [.nvmrc, .tool-versions, package.json]
     steps:
       - uses: actions/checkout@v3
       - name: Setup node from node version file
diff --git a/__tests__/data/package.json b/__tests__/data/package.json
index e537e200..b201009d 100644
--- a/__tests__/data/package.json
+++ b/__tests__/data/package.json
@@ -1,5 +1,5 @@
 {
   "engines": {
-    "node": ">=14.0.0"
+    "node": "^14.0.0"
   }
 }
diff --git a/dist/setup/index.js b/dist/setup/index.js
index 0a0c0bad..0407c1ce 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -71770,13 +71770,18 @@ function translateArchToDistUrl(arch) {
 function parseNodeVersionFile(contents) {
     var _a, _b;
     let nodeVersion;
-    const found = contents.match(/^(?:nodejs\s+)?v?(?<version>[^\s]+)$/m);
-    nodeVersion = (_a = found === null || found === void 0 ? void 0 : found.groups) === null || _a === void 0 ? void 0 : _a.version;
+    // Try parsing the file as an NPM `package.json`
+    // file.
+    try {
+        nodeVersion = (_a = JSON.parse(contents).engines) === null || _a === void 0 ? void 0 : _a.node;
+    }
+    catch (_c) {
+        core.warning('Node version file is not JSON file');
+    }
     if (!nodeVersion) {
         try {
-            // Try parsing the file as an NPM `package.json`
-            // file.
-            nodeVersion = (_b = JSON.parse(contents).engines) === null || _b === void 0 ? void 0 : _b.node;
+            const found = contents.match(/^(?:nodejs\s+)?v?(?<version>[^\s]+)$/m);
+            nodeVersion = (_b = found === null || found === void 0 ? void 0 : found.groups) === null || _b === void 0 ? void 0 : _b.version;
             if (!nodeVersion)
                 throw new Error();
         }
diff --git a/src/installer.ts b/src/installer.ts
index 193ff16a..c74fbc97 100644
--- a/src/installer.ts
+++ b/src/installer.ts
@@ -497,14 +497,18 @@ function translateArchToDistUrl(arch: string): string {
 export function parseNodeVersionFile(contents: string): string {
   let nodeVersion: string | undefined;
 
-  const found = contents.match(/^(?:nodejs\s+)?v?(?<version>[^\s]+)$/m);
-  nodeVersion = found?.groups?.version;
+  // Try parsing the file as an NPM `package.json`
+  // file.
+  try {
+    nodeVersion = JSON.parse(contents).engines?.node;
+  } catch {
+    core.warning('Node version file is not JSON file');
+  }
 
   if (!nodeVersion) {
     try {
-      // Try parsing the file as an NPM `package.json`
-      // file.
-      nodeVersion = JSON.parse(contents).engines?.node;
+      const found = contents.match(/^(?:nodejs\s+)?v?(?<version>[^\s]+)$/m);
+      nodeVersion = found?.groups?.version;
 
       if (!nodeVersion) throw new Error();
     } catch (err) {