如何在 Typescript 中解析 JSON 字符串类型安全JSON.parse

2022-08-30 01:11:13

有没有办法在Typescript中将字符串解析为JSON。
示例:在 JS 中,我们可以使用 .Typescript中有类似的功能吗?JSON.parse()

我有一个JSON对象字符串,如下所示:

{"name": "Bob", "error": false}

答案 1

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

(操场上的代码)


答案 2

类型安全JSON.parse

您可以继续使用 ,因为 TypeScript 是 JavaScript 的超集JSON.parse

这意味着您可以获取任何可用的JavaScript代码并将其放入TypeScript文件中,而不必担心它的确切编写方式。

还有一个问题:JSON.parse返回任何,这会破坏类型安全(不要使用任何类型)。

以下是针对更强类型的三种解决方案,按复杂性递增排序:

1. 用户自定义型防护装置

操场

// 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

2. 通用包装器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

3. 外部库

如果需要验证许多不同的值,则手动编写类型保护函数会变得很麻烦。有库可以帮助完成此任务 - 示例(没有完整列表):


更多信息