【问题标题】:how to parse json string and iterate json object如何解析json字符串并迭代json对象
【发布时间】:2015-01-31 15:35:16
【问题描述】:

我向服务器发出了 ajax 请求并从 json 字符串返回响应。当我使用 JSON.stringify 时,它有很多空白作为响应。当我尝试解析 json 对象时收到错误消息 SyntaxError: JSON.parse: JSON 数据的第 1 行第 1 列出现意外字符

下面是示例代码:

$.post("http://example.com/index.cfm?fuseaction=shopping.admin&stamps=getStampsRates&Order_No="+order_id+"&stamps_service_type="+selectedServiceType+"",function(data,status)
       {
           if(status=="success")
           {
               var data=JSON.parse(data);
               //original resonse aspected  from server     
               //   var json ='[{"PACKAGETYPE":"Postcard","AMOUNT":0.34},{"PACKAGETYPE":"Letter","AMOUNT":0.48},{"PACKAGETYPE":"Large Envelope or Flat","AMOUNT":0.98},{"PACKAGETYPE":"Thick Envelope","AMOUNT":1.93},{"PACKAGETYPE":"Package","AMOUNT":1.93},{"PACKAGETYPE":"Large Package","AMOUNT":1.93}] ';
               $.each(data, function(idx, obj) {
                   alert(obj.PACKAGETYPE);
               });
           }
       });

我做了一些更改然后尝试解析:

var data=JSON.stringify(data);
var newJ= JSON.parse(data);
alert("newJ:"+JSON.stringify(newJ));

并获得以下共鸣:

 "\r\n\r\n\t\r\n[{\"PACKAGETYPE\":\"Large Envelope or Flat\",\"AMOUNT\":2.69},{\"PACKAGETYPE\":\"Thick Envelope\",\"AMOUNT\":2.69},{\"PACKAGETYPE\":\"Package\",\"AMOUNT\":2.69},{\"PACKAGETYPE\":\"Large Package\",\"AMOUNT\":2.69}]\r\n\t\r\n\r\n"

并尝试迭代上面的json对象得到错误TypeError: t is undefined

请帮我解决以上问题。

谢谢

【问题讨论】:

  • 尝试登录data,然后向我们展示结果(不是预期的)
  • 我怀疑服务器已经对 JSON 进行了两次编码。查看控制台“网络”选项卡中的原始响应。
  • 正如 Barmar 所建议的那样,尝试data = JSON.parse(JSON.parse(data)),如果这样可以解决您的问题,数据是双重编码的,您应该修复生成该字符串的服务器代码
  • @JuanMendes 那如何修复错误?
  • @Sameek Mishra,回复是否与您在注释掉的“来自服务器的原始回复”中发布的内容完全相同?找出解析出错的地方对我们很有帮助。

标签: javascript jquery json


【解决方案1】:

我认为您的问题可能很复杂。首先,在同一范围内,您有两个“数据”,由于参考问题,它们可能会覆盖原始响应。另一个,就像@adeneo 说的,json 从服务器端格式错误。所以尝试改变这个。 我创建了一个 JSFiddle 来解析你的 JSON 响应的两个版本,因为根据你的帖子我们不确定数据响应的样子

JSFiddle 上的代码示例

var json ='[{"PACKAGETYPE":"Postcard","AMOUNT":0.34},{"PACKAGETYPE":"Letter","AMOUNT":0.48},{"PACKAGETYPE":"Large Envelope or Flat","AMOUNT":0.98},{"PACKAGETYPE":"Thick Envelope","AMOUNT":1.93},{"PACKAGETYPE":"Package","AMOUNT":1.93},{"PACKAGETYPE":"Large Package","AMOUNT":1.93}]';

var json1 = '"\r\n\r\n\t\r\n[{\"PACKAGETYPE\":\"Large Envelope or Flat\",\"AMOUNT\":2.69},{\"PACKAGETYPE\":\"Thick Envelope\",\"AMOUNT\":2.69},{\"PACKAGETYPE\":\"Package\",\"AMOUNT\":2.69},{\"PACKAGETYPE\":\"Large Package\",\"AMOUNT\":2.69}]\r\n\t\r\n\r\n"'

var obj = JSON.parse(json);
$.each(obj, function(i, item) {
    console.log(obj[i].PACKAGETYPE);
});

json1 = json1.split('[')[1].split(']')[0].replace('\\','');
json1 = '[' + json1 + ']';
console.log(json1);
var obj = JSON.parse(json1);
$.each(obj, function(i, item) {
    console.log(obj[i].PACKAGETYPE);
});

【讨论】:

  • 应用 yorr 建议代码后,我得到以下字符串:[{"PACKAGETYPE\":\"Large Envelope or Flat\",\"AMOUNT\":2.69},{\"PACKAGETYPE\" :\"厚信封\",\"AMOUNT\":2.69},{\"PACKAGETYPE\":\"包\",\"AMOUNT\":2.69},{\"PACKAGETYPE\":\"大包\",\"AMOUNT\":2.69}]
  • 我有变化并且工作得很好,Thanks.json1 = json1.split('[')[1].split(']')[0].replace(/\\/g, ' ');
猜你喜欢
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
相关资源
最近更新 更多