【问题标题】:Properly validate the JSON.parsed data in TypeScript在 TypeScript 中正确验证 JSON.parsed 数据
【发布时间】:2018-01-16 15:46:44
【问题描述】:

我正在为 Angular 创建一个小模块,但我遇到了检查 JSON.parsed 数据是否正确的情况。

read(): Position|null {
    try {
        ...
        let parsedData  = JSON.parse(data);
        if (parsedData && parsedData.x && parsedData.y)
            return new Position(parsedData.x, parsedData.y);
    } catch (e) {
        ...
    }
    return null;
}

这对我来说似乎不是一个很好的解决方案,好像我之前字符串化的对象中有更多属性,然后我需要检查每个属性。我也不确定当解析的数据为null 时会发生什么。是否有任何其他解决方案来检查存储数据?谢谢

【问题讨论】:

  • 这似乎是一个非常合理的解决方案。你到底关心什么?如果您正在解析的 JSON 有其他字段,则不会影响您在上面编写的逻辑。并且您将解析包装在一个 try-catch 中,它还应该处理任何格式错误的 JSON 案例。
  • 我担心将来会更改存储在 JSON 中的对象。如果我需要更改对象并期望解析对象的更多属性,那么我需要检查每个属性是否已设置。我正在考虑检查已解析数据的实例,但它可能不起作用,因为当我将 Position 对象字符串化然后将其解析回来时,它不再是 Position 的实例,对吗?
  • 如果你的 json 字符串已经是一个序列化的 Position 对象,你真的不需要做任何检查。您可以将 JSON.parse(data) 作为位置返回
  • 这就是我想要的,谢谢。也许您应该考虑将其总结并为该问题做出答案,以便我将其标记为正确。再次感谢

标签: angular typescript if-statement conditional-statements javascript-objects


【解决方案1】:

免责声明:以下代码不执行任何验证。此响应是根据 OP 的要求添加的

正如 cmets 中所讨论的,您想要的是:

read(): Position|null {
    try {
        return JSON.parse(data) as Position;
    } catch (e) {
        return null;
    }
}

【讨论】:

  • 问题是关于验证。这个答案根本没有提供任何验证。
  • 没错。我相信 OP 说他会在类型转换之后进行检查,并且不确定如何将通用 Object 转换为 Position 类型而不需要使用“new”实例化它。他明确要求我将其添加为这个问题的解决方案。
  • 根据讨论,这是真的,但它不做标题和质疑正义。请记住,SO 还应作为知识库为访问者服务。一个好的解决方案是更新答案或使其更通用。
猜你喜欢
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2022-09-27
  • 2022-01-16
  • 2013-02-26
相关资源
最近更新 更多