如何在 Typescript 中解析 JSON 字符串

新手上路,请多包涵

有没有办法在 Typescript 中将字符串解析为 JSON。

示例:在 JS 中,我们可以使用 JSON.parse() 。 Typescript中是否有类似的功能?

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

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

原文由 ssd20072 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.3k
2 个回答

Typescript 是 javascript(的超集),因此您只需像在 javascript 中一样使用 JSON.parse

 let obj = JSON.parse(jsonString);

只有在打字稿中,您才能对结果对象进行类型:

 interface MyObj {
 myString: string;
 myNumber: number;
 }

 let obj: MyObj = JSON.parse('{ "myString": "string", "myNumber": 4 }');
 console.log(obj.myString);
 console.log(obj.myNumber);

操场上的代码%3B%0D%0Aconsole.log(obj.myString)%3B%0D%0Aconsole.log(obj.myNumber)%3B))

原文由 Nitzan Tomer 发布,翻译遵循 CC BY-SA 3.0 许可协议

类型安全 JSON.parse

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

这意味着您可以将任何有效的 JavaScript 代码放入 TypeScript 文件中,而不必担心它的具体编写方式。

留下了一个问题: JSON.parse 返回 any ,这破坏了类型安全( 不要使用 any )。

以下是更强类型的三种解决方案,按复杂性升序排列:

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 可能扩展为 快速失败 或 try/catch JSON.parse 错误。

3. 外部图书馆

如果您需要验证许多不同的值,手动编写类型保护函数会变得很麻烦。有一些图书馆可以协助完成这项任务——例子(没有完整的列表):


更多信息

原文由 ford04 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏