使用jQuery解析JSON会将数组转换为哈希

时间:2014-09-15 21:10:49

标签: javascript jquery arrays json

我有一个这样的字符串:

string = '{ "key": [
  { "foo": "bar" }
] }';

通过执行

将此字符串转换为JSON对象
json = $.parseJSON(string);

然后它看起来像这样:

{ "key":
  { "0":
    { "foo": "bar" }
  }
}

所以似乎数组被转换为哈希。

期望的结果将是:

{ "key": [
  { "foo": "bar" }
] }

实现这一目标的最佳方法是什么?背景:我将JSON数据发布到URL,但需要数组保持不变,以便收件人可以相应地解析它。

更新

以下是我在Chrome 37.0.2062.120和jQuery 1.11.1的控制台中看到的内容:

enter image description here

它看起来像一个数组,但实际上只是另一个键为“0”的哈希。或者我得错了什么?

更新2

将字符串转换为JSON更新后,我将其发布到网址:

$.ajax({
    url: 'http://test.com',
    data: json,
    dataType: 'jsonp',
    type: 'post'
  })

的形式到达
{ "key":
  { "0":
    { "foo": "bar" }
  }
}

3 个答案:

答案 0 :(得分:2)

发送AJAX时,您可以自己编码JSON

对于JSONP,请使用

var json = '{ "key": [  { "foo": "bar" }] }';
var jsObj = $.parseJSON(json);
$.ajax({
    url: 'http://test.com',
    // You have to convert your JS object into a JSON string on your own
    // jQuery will convert them into form encoded values if you leave it as an object
    // But you want to send your whole JSON as one of the keys, 
    // so do use an object around your json to specify the the name of the
    // key value pair containing the JSON
    data: {myKey: JSON.stringify(jsObj)},
    dataType: 'jsonp',
    // The answer at http://stackoverflow.com/questions/6410810/rails-not-decoding-json-from-jquery-correctly-array-becoming-a-hash-with-intege
   // suggests you may need this for Rails to understand it
    contentType: 'application/json'
    // type can't be post for JSONP
    // type: 'post'
  })

对于POST,请使用

$.ajax({
    url: '/my/url/',
    // For POST, you can post the entire string, converting it on your own
    data: JSON.stringify(jsObj),
    type: 'POST'
  })

答案 1 :(得分:1)

在Javascript中,一切都是键和值的哈希值,这就是为什么你看到Arrays的哈希值,索引为hash键,值为object。

这适合我。

var jsonStr = '{ "key": [{ "foo": "bar" }] }';

var obj = $.parseJSON(jsonStr);
if (obj.key instanceof Array) {
alert('value is Array! and its length is > '+obj.key.length);
} else {
alert('Not an array');
}

http://jsbin.com/rifinu/1/

答案 2 :(得分:0)

一方面,所有这些都需要用括号括起来

string = '{"key": [
  { "foo": "bar" }
]}';

让jQuery用jQuery.parseJSON(string)

解析它

它包含在一个数组中,这就是你得到一个数组的原因。我猜这里,但你真正想要的是:

string = '{"key": 
  { "foo": "bar" }
}';

这样您只需按array['key']['foo']即可访问“栏”?如果是,请删除这些括号。