Это может быть дубликат Zod: Разобрать внешний файл JSON
У меня есть функция, которая ожидает строку JSON и анализирует ее до заданного типа, выведенного схемой Zod.
const createConfigurationFromJson = (content: string): Configuration => {
const rawConfiguration = JSON.parse(content);
return configurationSchema.parse(rawConfiguration);
};
Эта функция может выдать ошибку, если содержимое JSON является недопустимым JSON или Zod выдает ошибку синтаксического анализа. Можно ли позволить Zod анализировать строку JSON без использования другой сторонней библиотеки? Так что я могу быть уверен, что может быть только ошибка Зода?
Кажется, для этого нет пакета. Теоретически такой пакет будет делать чуть больше того, что вы уже делаете.
Может быть, вы могли бы окружить синтаксический анализ json блоком try catch и превратить общую ошибку в ошибку zod?
Если вы хотите, чтобы это было полностью в zod, создайте пользовательскую схему , которая возвращает true
, если это допустимый json, иначе false
. Затем, прежде чем вы сможете отправить это в configurationSchema
, вам нужно преобразовать строку content
в объект. Вы можете использовать .pipe, чтобы передать это configurationSchema
.
const configurationSchema = z.object({
name: z.string(),
version: z.string(),
description: z.string(),
});
type Configuration = z.infer<typeof configurationSchema>;
const createConfigurationFromJson = (content: string): Configuration => {
return z
.custom<string>((data) => {
try {
JSON.parse(content);
} catch (error) {
return false;
}
return true;
}, "invalid json") // write whatever error you want here
.transform((content) => JSON.parse(content))
.pipe(configurationSchema)
.parse(content);
};
(вы можете оптимизировать это, чтобы использовать сохраненное значение из первого JSON.parse
, но это всего лишь преждевременная оптимизация, которая не повлияет на подавляющее большинство проектов)
При тестировании с
const configuration1 = createConfigurationFromJson(`{
"name": "my-app",
"version": "1.0.0",
"description": "My awesome app"
}`);
const configuration2 = createConfigurationFromJson(`{
"banana": "🍌"
}`);
const configuration3 = createConfigurationFromJson(`{
fiadsjfoiajsdoivjdaoij
`);
он выводит успех и ошибки как
configuration1 {
name: "my-app",
version: "1.0.0",
description: "My awesome app"
}
configuration2 159 | const json = JSON.stringify(obj, null, 2);
160 | return json.replace(/"([^"]+)":/g, "$1:");
161 | };
162 | class ZodError extends Error {
163 | constructor(issues) {
164 | super();
^
ZodError: [
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"name"
],
"message": "Required"
},
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"version"
],
"message": "Required"
},
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"description"
],
"message": "Required"
}
]
errors: [
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"name"
],
"message": "Required"
},
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"version"
],
"message": "Required"
},
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"description"
],
"message": "Required"
}
]
at new ZodError (/Users/sgunter/code/zod-parse-json/node_modules/zod/lib/index.mjs:164:8)
at /Users/sgunter/code/zod-parse-json/node_modules/zod/lib/index.mjs:537:30
at parse (/Users/sgunter/code/zod-parse-json/node_modules/zod/lib/index.mjs:636:14)
at /Users/sgunter/code/zod-parse-json/index.ts:46:25
configuration3 159 | const json = JSON.stringify(obj, null, 2);
160 | return json.replace(/"([^"]+)":/g, "$1:");
161 | };
162 | class ZodError extends Error {
163 | constructor(issues) {
164 | super();
^
ZodError: [
{
"code": "custom",
"message": "invalid json",
"fatal": true,
"path": []
}
]
errors: [
{
"code": "custom",
"message": "invalid json",
"fatal": true,
"path": []
}
]
at new ZodError (/Users/sgunter/code/zod-parse-json/node_modules/zod/lib/index.mjs:164:8)
at /Users/sgunter/code/zod-parse-json/node_modules/zod/lib/index.mjs:537:30
at parse (/Users/sgunter/code/zod-parse-json/node_modules/zod/lib/index.mjs:636:14)
at /Users/sgunter/code/zod-parse-json/index.ts:55:25