【问题标题】:JSON format error after jQuery ajaxjQuery ajax 后的 JSON 格式错误
【发布时间】:2016-08-20 11:01:54
【问题描述】:

我正在通过 jQuery ajax 调用从科尔多瓦应用程序接收我的 nodejs 应用程序上的数据,它的格式为

{
     "network[msisdn]": "+254738XXXXXX",
      "network[country]": "ke",
      "network[roaming]": "false",
      "network[simState]": "Ready",
      "network[network]": "HSPA",
      "network[simSerial]": "89254031021032011310",
      "network[subscriber]": "639031023201131",
      "network[service]": "GSM"
}

而不是通常的

{
  network: {    
              "msisdn" : "",
               ...
           }
}

我可以在访问诸如 objectName.network.msisdn 之类的嵌套键时遍历 cordova 手机应用程序中的对象,但一旦我在 nodejs 中收到数据,我就不能后端。

我正在发布如下所示的数据

$.ajax({
         url: 'http://'+$scope.api.host+':'+$scope.api.port+'/notices',
         method: 'POST',
         dataType: 'json',
         data: $scope.storage.history[0]
      }).then(function(response){

          //! STORE THE RESULT IN THE RELEVANT OBJECT 
          $scope.storage.history[nextPos].locale = response;
          alert(JSON.stringify(response));

      }); 

我想访问对象的子键。

我在发布数据之前尝试过Json.Parse(Json.stringify(objectName))

我也尝试过在 jQuery ajax 调用中不使用 json 数据类型进行发布,

我已经尝试JSON.parse()后端的对象都无济于事。

非常感谢您的帮助。

【问题讨论】:

  • 我不明白,你需要这样格式化对象(network[msisdn])吗?
  • 感谢 Ahmad Bamieh 的关注,我需要将其格式化为 network.msisdn,但我得到了一个带有“network[msisdn]”键的对象

标签: javascript json


【解决方案1】:

如果您无法更改数据的返回方式,您可以使用字符串表示法访问它。这是一个使用字符串表示法的示例,以及一个可用于将其转换为嵌套对象的函数,以便您可以使用点表示法。

var exampleData = {
  "network[msisdn]": "+254738XXXXXX",
  "network[country]": "ke",
  "network[roaming]": "false",
  "network[simState]": "Ready",
  "network[network]": "HSPA",
  "network[simSerial]": "89254031021032011310",
  "network[subscriber]": "639031023201131",
  "network[service]": "GSM",
  "simpleKey": "simpleValue"
}

console.log(exampleData['network[country]']); // Logs -> ke

// This converts the keys in place
// it can be modified to return a new object instead
function convertKeys(data) {
  var pieces;
  for(var key in data) {
    if (data.hasOwnProperty(key)) {
      pieces = key.match(/(.+)\[(.+)]/);
      if (pieces) {
        data[pieces[1]] = data[pieces[1]] || {};
        data[pieces[1]][pieces[2]] = data[key];
        delete data[key];
      }
    }
  }
}

convertKeys(exampleData);
console.log(exampleData);
console.log(exampleData.network.simState); // Logs -> Ready

【讨论】:

  • 感谢@rdbya,您的解决方案按原样工作,但一旦我用我的数据替换它,我就会收到错误:** data.hasOwnProperty is not a function **
  • @rdbya,非常感谢。我通过用 if(data[key]) 以及 if(pieces) ... 验证替换该行代码来解决问题,以防止简单的键值对被操纵。
  • @ianmin2 很高兴你明白了。我更新了我的答案以包含您提到的更改。
  • 我刚刚发现我得到了 '.hasownproperty' is not defined 错误,因为我使用箭头函数作为父函数,并且默认情况下它们没有分配给它们的原型。
猜你喜欢
  • 2015-10-09
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
相关资源
最近更新 更多