【问题标题】:how to tell is a string is a stringify'd JSON object如何判断一个字符串是否是一个字符串化的 JSON 对象
【发布时间】:2012-01-02 14:36:12
【问题描述】:

对于任何感兴趣的人,我最终在这里构建了一个“本地存储过期”脚本,http://plugins.jquery.com/project/localcache

我在做什么:为存储构建一个扩展,以便用户可以这样做:

localStorage.setThing(key, value)

并且用户可以执行以下操作:

localStorage.setThing("key1", 1)
localStorage.setThing("key2", "this is a string")
localStorage.setThing("key3", { prop1: "this is a json obj" })

在我的 setThing 方法中,我正在检查 typeof 的值,如果是 typeof value == "object",我将其存储为 localStorage.setItem(key, JSON.stringify(value))

在 getThing 方法中,我知道将其放入 localStorage 的值始终是字符串。那么,我该怎么做呢?

var val = localStorage.getItem("key3")
if (val is a previously JSON.stringify'd object) // <-- ??
    return JSON.parse(val)

我是否需要对 val 进行正则表达式检查,如果需要,是否有人有方便的模式告诉我字符串是否真的是 JSON.stringify 对象?

谢谢!

【问题讨论】:

标签: javascript jquery json local-storage


【解决方案1】:

判断字符串是否为 JSON 的常用方法是通过 JSON 解码器运行它。如果成功,它就是 JSON :-) 这里不需要正则表达式。

【讨论】:

  • 直接运行JSON.parse(val)。不需要 if 语句。如果解析失败,则 val 不是有效的 JSON。
  • 对不起,我是新手 :) 那么,如何检查它是否失败?
  • 了解此类问题答案的最简单方法是阅读 JSON.parse 的文档,或者只是通过运行代码进行实验——在这种情况下,您将看到它抛出一个 JSONError。要了解捕获异常,请参阅javascriptkit.com/javatutors/trycatch.shtml
  • 以下内容未被捕获,即我无法使用此方法尝试解析。 var test = JSON.parse("3"); // 不会抛出错误,并且我不希望我的 JS 认为“3”是以前的 JSON 字符串化对象。可能必须使用正则表达式方法
【解决方案2】:

另一种选择是存储一个对象{isJsonObj:true, jsonObj: jsonObj},并检查类型是Object,isJsonObj是否为真。如果其中任何一个为假,则它不是 json obj(这意味着您不必解析)。我知道这意味着你不会总是在其中有一个字符串,但它使测试变得容易,并且不会带来大量开销。

【讨论】:

    【解决方案3】:

    执行此操作时您需要什么样的速度? 如果不是什么大问题,你总是可以尝试解析/解码 val,如果失败,那么它不是 JSON 对象。

    【讨论】:

    • 如果我尝试 { var x = JSON.parse("3"); },它不会抛出错误。所以,我可能不得不做正则表达式的方法,因为我总是试图解析一个字符串。还有其他想法吗?谢谢!
    【解决方案4】:

    你想检查变量是否被字符串化了吗?

    const obj = {"apple": 1, "banana": 2, "cat": 3}
    const stringify_value = JSON.stringify(obj)
    

    你可以试试lodash isString

    import isString from "lodash/isString"
    
    if(isString(stringify_value)) {
      // the value is stringify
    }else{
      // the value is not stringify   
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2011-02-05
      相关资源
      最近更新 更多