【问题标题】:Reverse of JSON.stringify?JSON.stringify 的反转?
【发布时间】:2012-06-25 16:05:12
【问题描述】:

我正在对像 {'foo': 'bar'} 这样的对象进行字符串处理

如何将字符串转回对象?

【问题讨论】:

  • 请注意,{foo: 'bar'} 不是有效的 JSON(虽然它是有效的 javascript 表达式)。
  • 只需尝试 JSON.parse。如果您的浏览器不支持,请尝试 json2.js
  • 伙计们,我们在这里与一只笑笑猫打交道。
  • 也许我应该添加另一个(阅读第四个)答案说你应该做 JSON.parse...
  • @RobW,原来你的谷歌链接指向这个问题作为热门话题。 #讽刺

标签: javascript json object


【解决方案1】:

你需要JSON.parse()这个字符串。

var str = '{"hello":"world"}';
try {
  var obj = JSON.parse(str); // this is how you parse a string into JSON 
  document.body.innerHTML += obj.hello;
} catch (ex) {
  console.error(ex);
}

【讨论】:

  • 专业提示:始终将 JSON.parse() 放入 try-catch 结构中,因为该方法可能会使您的 Node/Js 崩溃
【解决方案2】:

JSON.parseJSON.stringify 的反义词。

【讨论】:

    【解决方案3】:

    JSON.stringifyJSON.parse 几乎是相反的,“通常”这种事情会起作用:

    var obj = ...;
    var json = JSON.stringify(obj);  
    var obj2 = JSON.parse(json);
    

    这样 obj 和 obj2 是“相同的”。

    但是有一些限制需要注意。 通常,当您处理简单的对象时,这些问题并不重要。 但我会在这里说明其中的一些,使用这个辅助函数:

    function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
    
    • 你只会得到对象的ownProperties而失去原型:

      var MyClass = function() { this.foo="foo"; } 
      MyClass.prototype = { bar:"bar" }
      
      var o = new MyClass();
      var oo = jsonrepack(o);
      console.log(oo.bar); // undefined
      console.log( oo instanceof MyClass ); // false
      
    • 你会失去身份:

      var o = {};
      var oo = jsonrepack(o);
      console.log( o === oo ); // false
      
    • 函数不存在:

      jsonrepack( { f:function(){} } ); // Returns {}
      
    • 日期对象以字符串形式结束:

      jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
      
    • 未定义的值不存在:

      var v = { x:undefined }
      console.log("x" in v);              // true
      console.log("x" in jsonrepack(v));  // false
      
    • 提供toJSON 函数的对象可能无法正常运行。

      x = { f:"foo", toJSON:function(){ return "EGAD"; } }
      jsonrepack(x) // Returns 'EGAD'
      

    我确信其他内置类型也存在问题。 (所有这些都使用 node.js 进行了测试,因此根据您的环境,您的行为也可能略有不同)。

    当它确实很重要时,有时可以使用JSON.parseJSON.stringify 的附加参数来克服它。例如:

    function MyClass (v) {
       this.date = new Date(v.year,1,1);
       this.name = "an object";
    };
    
    MyClass.prototype.dance = function() {console.log("I'm dancing"); }
    
    var o = new MyClass({year:2010});
    var s = JSON.stringify(o);
    
    // Smart unpack function
    var o2 = JSON.parse( s, function(k,v){
      if(k==="") { 
         var rv = new MyClass(1990,0,0);
         rv.date = v.date;
         rv.name = v.name;
         return rv
      } else if(k==="date") {
        return new Date( Date.parse(v) );
      } else { return v; } } );
    
    console.log(o);             // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
    console.log(o.constructor); // [Function: MyClass]
    o.dance();                  // I'm dancing
    
    console.log(o2);            // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
    console.log(o2.constructor) // [Function: MyClass]        
    o2.dance();                 // I'm dancing
    

    【讨论】:

    • 根据JSON SPEC “JSON 是一种完全独立于语言的文本格式,但使用 C 系列语言的程序员熟悉的约定,包括 C、C++、C#、 Java、JavaScript、Perl、Python 等等。”。对我来说,这表明 JSON 应该只用于与语言无关的类型/数据。因此,您的示例(虽然非常有效)仅与 JSON 与 JavaScript 的关联有关,并且应该更多地定义为 JSONP,而不是真正的 JSON...IMO
    • 一个例子是{ bar:"bar" }(来自你的原型)是not considered valid json,因为foo是一个变量而不是一个字符串。有效的 json 需要 key 成为 string
    • 我读到 OP 说“我将 javascript 对象转换为 JSON 字符串,现在我想将其转换回来 - 我该怎么做?”所有其他答案都说只使用JSON.parse。我只是警告说有很多情况无法正确处理。如果您使用纯原始数据(无类、原型)并且仅使用 JSON 支持的数据类型(无日期、XML、HTML 等),那么您就可以了。
    • 同样在 Javascript 中,X = { foo:"bar" }X = { "foo":"bar" } 相同,与 X = {}; X.foo = "bar" 相同,与 X={}; X["foo"] = "bar" 相同 结果对象在所有 4 种情况下都是相同的。这对生成的 JSON 的有效性没有影响。
    • 这是一个非常全面的答案,更值得被接受。感谢您的出色工作。
    【解决方案4】:

    推荐使用JSON.parse

    你可以做一个替代方案:

     var myObject = eval('(' + myJSONtext + ')');
    

    Json in javascript

    Why is using the JavaScript eval function a bad idea?

    【讨论】:

      【解决方案5】:

      http://jsbin.com/tidob/1/edit?js,console,output

      原生 JSON 对象包括两个关键方法。

      1. JSON.parse()
      2. JSON.stringify() 
      
      1. JSON.parse() 方法解析 JSON 字符串 - 即重建原始 JavaScript 对象

        var jsObject = JSON.parse(jsonString);

      2. JSON.stringify() 方法接受一个 JavaScript 对象并返回其等效的 JSON。

        var jsonString = JSON.stringify(jsObject);

      【讨论】:

        【解决方案6】:

        这个怎么样

        var parsed = new Function('return ' + stringifiedJSON )();
        

        对于eval,这是一个更安全的替代方案。

        var stringifiedJSON = '{"hello":"world"}';
        var parsed = new Function('return ' + stringifiedJSON)();
        alert(parsed.hello);

        【讨论】:

          【解决方案7】:

          看看这个。
          http://jsfiddle.net/LD55x/

          代码:

          var myobj = {};
          myobj.name="javascriptisawesome";
          myobj.age=25;
          myobj.mobile=123456789;
          debugger;
          var str = JSON.stringify(myobj);
          alert(str);
          var obj = JSON.parse(str);
          alert(obj);
          

          【讨论】:

            【解决方案8】:

            这个部分解决方案怎么样?

            我想存储(使用 Config 节点)一个全局 bigobj,带有数据 + 方法(作为导入外部库的替代方法),在我的流程中的许多功能节点中使用:

            奇怪但有效: 全局变量“bigobj”:

            {
            some[]more[]{dx:"here"} , // array of objects with  array of objects. The 'Config' node requires JSON.
            .....
             "get_dx": "function( d,p) {  return this.some[d].more[p].dx; }"  // test function
            }
            

            即函数的 JSON 版本....(全部在一行中:()

            使用: 函数节点内部:

            var bigO = global.get("bigobj");
            
            function callJSONMethod(obj, fname, a, b, c, d){
                // see: https://stackoverflow.com/questions/49125059/how-to-pass-parameters-to-an-eval-based-function-injavascript
            var wrap = s => "{ return " + obj[fname] + " };" //return the block having function expression
            var func = new Function(wrap(obj[fname]));
            return func.call( null ).call( obj, a, b, c, d); //invoke the function using arguments
            }
            
            msg.payload =callJSONMethod(bigO, "get_dx", 2, 2); 
            return msg:
            

            返回“这里”,难以置信!

            即我必须使用 bigobj 将函数 callJSONMethod() 添加到任何功能块..... 也许可以接受。

            最好的问候

            【讨论】:

              【解决方案9】:
              $("#save").click(function () {
                  debugger
                  var xx = [];
                  var dd = { "firstname": "", "lastname": "", "address": "" };
                  var otable1 = $("#table1").dataTable().fnGetData();
              
                  for (var i = 0; i < otable1.length; i++) {
                      dd.firstname = otable1[i][0];
                      dd.lastname = otable1[i][1];
                      dd.address = otable1[i][2];
                      xx.push(dd);
                      var dd = { "firstname": "", "lastname": "", "address": "" };
                  }
                  JSON.stringify(alert(xx));
                  $.ajax({
              
                      url: '../Home/save',
                      type: 'POST',
                      data: JSON.stringify({ u: xx }),
                      contentType: 'application/json;',
                      dataType: 'json',
                      success: function (event) {
                          alert(event);
                          $("#table2").dataTable().fnDraw();
                          location.reload();
                      }
                  });
              });
              

              【讨论】:

                猜你喜欢
                • 2013-01-15
                • 1970-01-01
                • 2023-03-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-27
                • 2012-06-13
                相关资源
                最近更新 更多