【问题标题】:JSON data parseJSON数据解析
【发布时间】:2018-08-30 14:58:06
【问题描述】:
$scope.partsLinesTest = data[0].instock; // this is getting the JSOn data 
from my http request

for(var i=0; $scope.partsLinesTest.length > 0; i++) {
 //$scope.partsLinesTest =  $scope.partsLinesTest[0].instock;
console.log($scope.partsLinesTest.replace(/['{[\]}']/g,''))
var str = $scope.partsLinesTest;
$scope.partsLinesStock = str.replace(/['{[\]}']/g,'');
}

Json 数据的格式如下,我的问题是 instock 由于额外的常规括号和花括号,这就是我认为使用 RegEX 可以解决问题的原因,但是我似乎无法正确遍历数据和将其发布回视图中,我也在使用 Angular

var test = [
  {
      "id": 1,
      "title": "This is a document",
      "desc": "PO",
      "date": "2017-01-15",
      "instock": "[{'branch': 'Edmonton', 'quantity': 2}]"
  }

【问题讨论】:

  • 对此的明智解决方案是修复数据的来源,以便提供有效的 JSON。
  • 另一个可行的解决方案是使用eval(data[0].instock),但出于安全原因我不建议这样做。
  • JSON.parse(data[0].instock.replace(/'/g, "\"")),但从源头解决问题比尝试修复损坏的 JSON 要好得多
  • 我已经更新了一个答案@Darren

标签: javascript angularjs json


【解决方案1】:

一个可行的临时解决方案(不,更好,一个临时workaround)是使用Javascript的eval()函数(你应该永远不要在生产系统上这样做,因为它会带来安全漏洞!):

var test = [
  {
      "id": 1,
      "title": "This is a document",
      "desc": "PO",
      "date": "2017-01-15",
      "instock": "[{'branch': 'Edmonton', 'quantity': 2}]"
  }]
  
console.log(eval(test[0].instock))
console.log(Array.isArray(eval(test[0].instock)))

正如@Quentin 指出的那样,正确的解决方案是让服务器发出格式正确的 JSON(这需要将单引号 ' 替换为转义的双引号 \")。

请阅读为什么强烈反对使用eval()Why is using the JavaScript eval function a bad idea?

【讨论】:

    【解决方案2】:

    如果它是 JSON 风格的,你知道它将有 ,: 划分键和值。我会首先清除所有其他字符并将其拆分为:

    var jsonString = "[{'branch': 'Edmonton', 'quantity': 2}]"
    var cleaned = jsonString.replace(/[^a-zA-Z0-9:,]/g,'')
      //"branch:Edmonton,quantity:2"
    
    var splitIntoKeyVal = cleaned.split(',').map(function(row){ return row.split(':')})
      //[["branch","Edmonton"],["quantity],2]]
    var json = {}
    
    splitIntoKeyVal.forEach(function(row){
      json[row[0]] = row[1]
    })
    

    如果您认为您的值可能包含 :,,您可能需要做一些其他的正则表达式技巧。

    【讨论】:

      【解决方案3】:

      为了获得数量,您必须解析data.instock json。

      var data = {
           "id": 1,
           "title": "This is a document",
           "desc": "PO",
           "date": "2017-01-15",
           "instock": '[{"branch": "Edmonton", "quantity": 2}]'
      };
      
          
      var stock = JSON.parse(data.instock);
      
      console.log(stock[0].quantity); 
      //$scope.partsLinesStock = stock[0].quantity;

      【讨论】:

      • instock 是一个字符串,而不是一个对象数组。
      • 重新编辑:那会出错。该字符串不包含 JSON。
      • 我再次编辑了答案。如果instock 是一个有效的 JSON,它将被解析。看看这个
      • 我们知道它不是有效的 JSON,我们可以在问题中看到它。假设它是有效的……很愚蠢。
      • 现在检查输出 :) @Quentin
      猜你喜欢
      • 2017-08-25
      • 1970-01-01
      • 2016-11-19
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多