Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7c68374

Browse files
committedApr 18, 2024
Fix parsing failures whtn ChatGPT returns JSON with trailing commas
1 parent d35918a commit 7c68374

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed
 

‎typescript/src/ts/strip-whitespace.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* The following code snippet is copied from the index.ts file of the strip-json-trailing-commas project
3+
* (commit 3cfa16a2aa6bbef8ed740c346321ef6c2b42237d),
4+
* available at: https://github.com/nokazn/strip-json-trailing-commas/blob/3cfa16a2aa6bbef8ed740c346321ef6c2b42237d/src/index.ts
5+
*
6+
* The original code is licensed under the MIT License:
7+
*
8+
* MIT License
9+
*
10+
* Copyright 2021 https://github.com/nokazn
11+
*
12+
* Permission is hereby granted, free of charge, to any person obtaining a copy
13+
* of this software and associated documentation files (the "Software"), to deal
14+
* in the Software without restriction, including without limitation the rights
15+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16+
* copies of the Software, and to permit persons to whom the Software is
17+
* furnished to do so, subject to the following conditions:
18+
*
19+
* The above copyright notice and this permission notice shall be included in all
20+
* copies or substantial portions of the Software.
21+
*
22+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28+
* SOFTWARE.
29+
*/
30+
31+
export default function stripJsonTrailingCommas(content: string): string {
32+
/**
33+
* preceded by number or string or boolean (true/false) or null or '}' or ']' (and with 0 or more spaces)
34+
* match with ','
35+
* followed by '}' or ']'
36+
*/
37+
return content.replace(/(?<=(true|false|null|["\d}\]])\s*),(?=\s*[}\]])/g, '');
38+
}

‎typescript/src/typechat.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Result, success, error } from "./result";
22
import { TypeChatLanguageModel, PromptSection } from "./model";
3+
import stripJsonTrailingCommas from "./ts/strip-whitespace";
34

45
/**
56
* Represents an object that can translate natural language requests in JSON objects of the given type.
@@ -136,7 +137,7 @@ export function createJsonTranslator<T extends object>(model: TypeChatLanguageMo
136137
if (!(startIndex >= 0 && endIndex > startIndex)) {
137138
return error(`Response is not JSON:\n${responseText}`);
138139
}
139-
const jsonText = responseText.slice(startIndex, endIndex + 1);
140+
const jsonText = stripJsonTrailingCommas(responseText.slice(startIndex, endIndex + 1));
140141
let jsonObject;
141142
try {
142143
jsonObject = JSON.parse(jsonText) as object;

0 commit comments

Comments
 (0)
Please sign in to comment.