如何在 Typescript 中解析 JSON 字符串类型安全JSON.parse
2022-08-30 01:11:13
有没有办法在Typescript中将字符串解析为JSON。
示例:在 JS 中,我们可以使用 .Typescript中有类似的功能吗?JSON.parse()
我有一个JSON对象字符串,如下所示:
{"name": "Bob", "error": false}
有没有办法在Typescript中将字符串解析为JSON。
示例:在 JS 中,我们可以使用 .Typescript中有类似的功能吗?JSON.parse()
我有一个JSON对象字符串,如下所示:
{"name": "Bob", "error": false}
Typescript是javascript的(超集),所以你只是像在javascript中一样使用:JSON.parse
let obj = JSON.parse(jsonString);
只有在 typescript 中,你才能对生成的对象有一个类型:
interface MyObj {
myString: string;
myNumber: number;
}
let obj: MyObj = JSON.parse('{ "myString": "string", "myNumber": 4 }');
console.log(obj.myString);
console.log(obj.myNumber);
(操场上的代码)
JSON.parse
您可以继续使用 ,因为 TypeScript 是 JavaScript 的超集:JSON.parse
这意味着您可以获取任何可用的JavaScript代码并将其放入TypeScript文件中,而不必担心它的确切编写方式。
还有一个问题:JSON.parse
返回任何
,这会破坏类型安全(不要使用任何类型
)。
以下是针对更强类型的三种解决方案,按复杂性递增排序:
// For example, you expect to parse a given value with `MyType` shape
type MyType = { name: string; description: string; }
// Validate this value with a custom type guard (extend to your needs)
function isMyType(o: any): o is MyType {
return "name" in o && "description" in o
}
const json = '{ "name": "Foo", "description": "Bar" }';
const parsed = JSON.parse(json);
if (isMyType(parsed)) {
// do something with now correctly typed object
parsed.description
} else {
// error handling; invalid JSON format
}
isMyType
称为类型防护。它的优点是,您可以在truthy分支中获得一个完全类型的对象。if
JSON.parse
创建一个泛型包装器,它将一个类型保护作为输入,并返回解析的、类型化的值或错误结果:JSON.parse
const safeJsonParse = <T>(guard: (o: any) => o is T) =>
(text: string): ParseResult<T> => {
const parsed = JSON.parse(text)
return guard(parsed) ? { parsed, hasError: false } : { hasError: true }
}
type ParseResult<T> =
| { parsed: T; hasError: false; error?: undefined }
| { parsed?: undefined; hasError: true; error?: unknown }
用法示例:
const json = '{ "name": "Foo", "description": "Bar" }';
const result = safeJsonParse(isMyType)(json) // result: ParseResult<MyType>
if (result.hasError) {
console.log("error :/") // further error handling here
} else {
console.log(result.parsed.description) // result.parsed now has type `MyType`
}
safeJsonParse
可能会扩展为快速失败或尝试/捕获错误。JSON.parse
如果需要验证许多不同的值,则手动编写类型保护函数会变得很麻烦。有库可以帮助完成此任务 - 示例(没有完整列表):
io-ts
:具有fp-ts
对等依赖性,使用函数式编程风格zod
:力求比io-ts
typescript-is
:用于编译器API的TS转换器,需要额外的包装器,如ttypescripttypescript-json-schema
/ajv
:从类型创建JSON架构,并用它来验证它ajv
更多信息