JSON解析与多个数据

问题描述:

Jsonlint显示,这JSON对象是有效的:JSON解析与多个数据

[{"obj":{"markers":"[{\"k\":47.040182144806664,\"B\":0.52734375},{\"k\":50.90303283111257,\"B\":10.37109375},{\"k\":52.53627304145945,\"B\":-1.7578125},{\"k\":41.77131167976406,\"B\":-6.591796875}]","path":"[[47.040182144806664,0.52734375],[50.90303283111257,10.37109375],[52.53627304145945,-1.7578125],[41.77131167976406,-6.591796875]]"}}] 

我试图访问标记与K,B和路径元素,但它总是设置为undefined。这里是我的代码:

try { 

     var jsonData = JSON.parse(myJson); 
     console.log(jsonData.obj[0].markers[0].k); 
    } 
catch (e) { 
      console.error("Parsing error:", e); 
      } 

有人能告诉我如何正确访问我的JSON对象的元素?谢谢您的帮助。

+0

'obj'是一个对象,而不是一个数组 – chazsolo 2014-12-11 00:02:26

+0

@chazsolo没有,obj是只是一个索引我在我的MySQL查询中使用的数组像这样:$ rows [] = array('obj'=> $ r); echo json_encode($ rows);它可以是'Bob'... – 2014-12-11 00:04:02

+0

它是因为标记对象是一个字符串而不是数组所以“markers”的值:“value here in string” – 2014-12-11 00:07:07

一定有什么出了错在创建这个字符串。是的,它是有效的JSON,但它的格式与您想象的不同,因为您会转义控制字符,如"[]

试试这个字符串,而不是:

[ 
    { 
     "obj":{ 
     "markers":[ 
      { 
       "k":47.040182144806664, 
       "B":0.52734375 
      }, 
      { 
       "k":50.90303283111257, 
       "B":10.37109375 
      }, 
      { 
       "k":52.53627304145945, 
       "B":-1.7578125 
      }, 
      { 
       "k":41.77131167976406, 
       "B":-6.591796875 
      } 
     ], 
     "path":[ 
      [ 
       47.040182144806664, 
       0.52734375 
      ], 
      [ 
       50.90303283111257, 
       10.37109375 
      ], 
      [ 
       52.53627304145945, 
       -1.7578125 
      ], 
      [ 
       41.77131167976406, 
       -6.591796875 
      ] 
     ] 
     } 
    } 
] 

,而不是你的字符串:

[ 
    { 
     "obj":{ 
     "markers":"[{\"k\":47.040182144806664,\"B\":0.52734375},{\"k\":50.90303283111257,\"B\":10.37109375},{\"k\":52.53627304145945,\"B\":-1.7578125},{\"k\":41.77131167976406,\"B\":-6.591796875}]", 
     "path":"[[47.040182144806664,0.52734375],[50.90303283111257,10.37109375],[52.53627304145945,-1.7578125],[41.77131167976406,-6.591796875]]" 
     } 
    } 
] 
+0

也许您的JSON描述更加完善,我只是测试它,但仍然未定义,当我尝试访问JSON.parse()后的元素。 – 2014-12-11 00:24:01

+1

你是如何获取价值的?为了获得第一个'47.040182144806664',我做了'jsonData [0] .obj.markers [0] .k'。你是否也这样做?这对我来说工作正常... – orange 2014-12-11 00:26:08

+0

对不起,你的版本是正确的,现在更好,谢谢! – 2014-12-11 00:29:54

你必须从我可以告诉两个问题:

一个,是的,它是有效的JSON,但标记和路径对象值括在字符串引号:

"markers":"[{\"k\":47.040182144806664,\"B\":0.52734375},{\"k\":50.90303283111257,\"B\":10.37109375},{\"k\":52.53627304145945,\"B\":-1.7578125},{\"k\":41.77131167976406,\"B\":-6.591796875}]", 
"path":"[[47.040182144806664,0.52734375],[50.90303283111257,10.37109375],[52.53627304145945,-1.7578125],[41.77131167976406,-6.591796875]]" 

你更想要的是:

"markers":[{"k":47.040182144806664,"B":0.52734375},{"k":50.90303283111257,"B":10.37109375},{"k":52.53627304145945,"B":-1.7578125},{"k":41.77131167976406,"B":-6.591796875}], 

"path":[[47.040182144806664,0.52734375],[50.90303283111257,10.37109375],[52.53627304145945,-1.7578125],[41.77131167976406,-6.591796875]] 

但鉴于上述情况,也无法逃避的钾,硼对象名称的标记\ “K \” 应为 “K”:

因此,完成编辑JSON应该是这样的:

[{"obj":{"markers":[{"k":47.040182144806664,"B":0.52734375},{"k":50.90303283111257,"B":10.37109375},{"k":52.53627304145945,"B":-1.7578125},{"k":41.77131167976406,"B":-6.591796875}],"path":[[47.040182144806664,0.52734375],[50.90303283111257,10.37109375],[52.53627304145945,-1.7578125],[41.77131167976406,-6.591796875]]}}] 
+0

你的标记和路径在你的答案中仍然是双引号的? – 2014-12-11 00:17:47

+0

是的,这只是对象名称,但值不是引号 – 2014-12-11 00:18:16