Convert Javascript Object (incl. functions) to String

后端 未结 10 997
你的背包
你的背包 2020-12-29 21:35

Hey, Im trying to convert specific javascript objects to a String. So far I\'m working with json2.js. As soon as my Object contain functions, those functions are stripped. I

相关标签:
10条回答
  • 2020-12-29 22:06

    So I was just testing your script on one of my project, and there's a problem with Object keys that contain special characters (like / or -).

    You should consider wrapping theses keys with quotes.

    return `"${entry[0]}" : ${anyToString(entry[1])}`;
    
    0 讨论(0)
  • 2020-12-29 22:08

    // utility for logging
    var log = function(s){
      var d = document.getElementById('log');
      var l = document.createElement('div');
      l.innerHTML = (typeof s === 'object')?JSON.stringify(s):s;
      d.appendChild(l);
    }
    
    
    // wrapper function
    
    var obj = {
      'x-keys': {
        'z': function(e){console.log(e);},
        'a': [function(e){console.log('array',e);},1,2]
      },
      's': 'hey there',
      'n': 100
    };
    log(obj);
    
    // convert the object to a string 
    function otos(obj){
      var rs = '';
      var not_first = false;
      
      for(var k in obj){
        if(not_first) rs += ',';
        if(typeof obj[k] === 'object'){
          rs +=  '"'+k+'": {'+otos(obj[k])+'}';
        }
        else if(typeof obj[k] === 'string' || typeof obj[k] === 'function'){
          rs += '"'+k+'":"'+obj[k]+'"';
        }
        else if(typeof obj[k] === 'number'){
          rs += '"'+k+'":'+obj[k]+'';
        }
        else {
          // if it gets here then we need to add another else if to handle it
          console.log(typeof obj[k]);
        }
        not_first = true;
      }
      return rs;
    }
    // convert a string to object
    function stoo(str){
      // we doing this recursively so after the first one it will be an object
      try{
        var p_str = JSON.parse('{'+str+'}');
      }catch(e){ var p_str = str;}
      
      var obj = {};
      for(var i in p_str){
        if(typeof p_str[i] === 'string'){
          if(p_str[i].substring(0,8) === 'function'){
            eval('obj[i] = ' + p_str[i] );
          }
          else {
            obj[i] = p_str[i];
          }
        }
        else if(typeof p_str[i] === 'object'){
          obj[i] = stoo(p_str[i]);
        }
      }
      return obj;
    }
    
    // convert object to string
    var s = otos(obj);
    log(s);
    // convert string to object
    var original_obj = stoo(s);
    
    log(original_obj);
    log( original_obj['x-keys'].z('hey') );
    log( original_obj['x-keys'].a[0]('hey') );
    <div id='log'></div>

    I realize this is very old but I have a solution here

    https://jsfiddle.net/stevenkaspar/qoghsxhd/2/

    May not work for all cases but it is a good start

    It will convert this into a string and then back into an object and you can run the functions

    var obj = {
      'x-keys': {
        'z': function(e){console.log(e);},
        'a': [function(e){console.log('array',e);},1,2]
      },
      's': 'hey there',
      'n': 100
    };
    
    0 讨论(0)
  • 2020-12-29 22:10

    The short answer is that you cannot convert arbitrary JavaScript functions to strings. Period.

    Some runtimes are kind enough to give you the string serialization of functions you defined but this is not required by the ECMAScript language specification. The "toString()" example you mentioned is a good example of why it cannot be done - that code is built in to the interpreter and in fact may not be implemented in JavaScript (but instead the language in which the runtime is implemented)! There are many other functions that may have the same constraints (e.g. constructors, built-ins, etc).

    0 讨论(0)
  • 2020-12-29 22:11

    Combining a few options

    var aObj = { 
        v: 23,
        a: function() { 
            return true; 
        } 
    };
    var objStr = '';
    for (var member in aObj) {
        objStr += (objStr ? ',\n': '')+
            member + ':' + aObj[member] + '';
    }   
    
    console.log('{\n'+
        objStr + '\n}');
    

    JSFiddle

    0 讨论(0)
提交回复
热议问题