【问题标题】:Deserialize JSON into specific/existing JavaScript object将 JSON 反序列化为特定/现有的 JavaScript 对象
【发布时间】:2018-03-28 09:03:58
【问题描述】:

有没有办法将 JSON 字符串解析为现有的 Javascript 对象: 假设我已经创建了这个对象:

var ClientState = function(){
    this.userId ="";
    this.telephoneState = "UNKNOWN";
    this.agentState = "UNKNOWN";
    this.muteState = "UNKNOWN";
    this.number = "";
    this.ready = false;
}

ClientState.prototype = {
    doNastyStuff: function(){
        //do something here
    }
    //other methods here
}

我有这个 json 来自网络:

{"userId":"xyz","telephoneState":"READY","agentState":"UNKNOWN","muteState":"MUTED","number":"","ready":false}

是否可以反序列化为上面指定的对象?这样我就可以使用上面指定的所有方法了吗? 或者通常是否可以反序列化为特定的目标对象(无需在此目标对象中指定反序列化)? (我知道我可以创建一个接受 json 或解析对象的构造函数。)

【问题讨论】:

    标签: javascript json deserialization


    【解决方案1】:

    是的!您可以使用Object.assign 用另一个对象覆盖一个对象的属性:

    var ClientState = function() {
      this.userId = "";
      this.telephoneState = "UNKNOWN";
      this.agentState = "UNKNOWN";
      this.muteState = "UNKNOWN";
      this.number = "";
      this.ready = false;
    }
    
    var c = new ClientState();
    console.log('prior assignment: ', c);
    
    Object.assign(c, {
      "userId": "xyz",
      "telephoneState": "READY",
      "agentState": "UNKNOWN",
      "muteState": "MUTED",
      "number": "",
      "ready": false
    });
    
    console.log('after assignment: ', c);

    请注意,它会通过匹配相应的键来用目标对象(第二个对象)覆盖源对象(第一个对象)的所有属性。目标对象中不存在的键在源对象中保持不变。

    【讨论】:

    • 这正是我需要的:-)。我可以直接分配 json 字符串还是必须先“解析”它?
    【解决方案2】:

    这是你的想法吗?

    function parseAs(targetClass, rawJSON) {
        return Object.assign(new targetClass(), JSON.parse(rawJSON));
    }
    
    var clientState = parseAs(ClientState, '{"userId":"xyz"}');
    

    我不认为有一个原生 JSON 方法可以做到这一点,但你可以写一个像上面那样的函数。您甚至可以在 JSON 类本身上定义它:

    JSON.parseAs = function(targetClass, rawJSON) {
        return Object.assign(new targetClass(), JSON.parse(rawJSON));
    }
    

    【讨论】:

      【解决方案3】:

      如果您想使用您的函数将对象值添加到实例属性中:

      function ClientState() {
        this.userId = "";
        this.telephoneState = "UNKNOWN";
        this.agentState = "UNKNOWN";
        this.muteState = "UNKNOWN";
        this.number = "";
        this.ready = false;
      }
      
      ClientState.prototype = {
        doNastyStuff: function(json) {
          const data = JSON.parse(json);
          Object.assign(this, data);
        }
      }
      
      const json = '{"userId":"xyz","telephoneState":"READY","agentState":"UNKNOWN","muteState":"MUTED","number":"","ready":false}';
      const clientState = new ClientState();
      clientState.doNastyStuff(json);
      console.log(clientState);

      【讨论】:

        猜你喜欢
        • 2011-09-23
        • 2012-09-13
        • 1970-01-01
        • 2011-12-23
        • 2022-01-20
        • 1970-01-01
        • 2021-12-16
        相关资源
        最近更新 更多