2017-09-15 104 views
0

我正在開發一個android應用程序,它需要一個json並獲取一組通道來從中散播。 Json是由這個非常簡單的PHP腳本生成的。無法從JSON使用getJSONArray獲取數組

<?php 

$channels = [ 
'channels' => [ 
     'tele5' => 'http://mset-prod-1.live-delivery.ooyala.com/out/u/3vkkbgnvsm2r5/104951/RsZXlnNTE6re1fFuFEI0UrdA2Uj7pNGM/cn/5d62490854b545598f64eaa84709400b_4.m3u8', 
     'divinity' => 'http://mset-prgb-2.live-delivery.ooyala.com/out/u/3vkkbgnvsm2r5/104951/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B/cn/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8', 
     'bemad' => 'http://mset-prgb-2.live-delivery.ooyala.com/out/u/3vkkbgnvsm2r5/104951/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B/cn/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8', 
     'antena3' => 'http://a3live-lh.akamaihd.net/i/[email protected]/master.m3u8' 
     ] 
]; 

echo json_encode($channels); 

該腳本發送,我認爲,正確的JSON字符串

{ 
    "channels":{ 
     "tele5":"http:\/\/mset-prod-1.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/RsZXlnNTE6re1fFuFEI0UrdA2Uj7pNGM\/cn\/5d62490854b545598f64eaa84709400b_4.m3u8", 
     "divinity":"http:\/\/mset-prgb-2.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B\/cn\/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8", 
     "bemad":"http:\/\/mset-prgb-2.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B\/cn\/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8", 
     "antena3":"http:\/\/a3live-lh.akamaihd.net\/i\/[email protected]\/master.m3u8" 
    } 
} 

我加載JSON並試圖讓和陣在這個片段中

JSONObject json = new JSONObject(response); 

    channels = json.getJSONArray("channels"); 
    for (int i = 0; i < channels.length(); i++) { 
     JSONObject channel = channels.getJSONObject(i); 
     String name = channel.getString("name"); 
     String url = channel.getString("url"); 
     Channel ch = new Channel(name, url); 
     result.add(ch); 
    } 

但功能getJSONArray投錯誤

Value {"tele5":"http:\/\/mset-prod-1.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/RsZXlnNTE6re1fFuFEI0UrdA2Uj7pNGM\/cn\/5d62490854b545598f64eaa84709400b_4.m3u8","divinity":"http:\/\/mset-prgb-2.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B\/cn\/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8","bemad":"http:\/\/mset-prgb-2.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B\/cn\/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8","antena3":"http:\/\/a3live-lh.akamaihd.net\/i\/[email protected]5248\/master.m3u8"} at channels of type org.json.JSONObject cannot be converted to JSONArray 

我一直在嘗試改變我的原始php數組,以便能夠解析json字符串,但沒有運氣。

我在做什麼錯?

在此先感謝。

+0

我雖然,也許問題是PHP數組不能很好地被編碼爲一個json數組。 – Dhouard

+0

這是真的,它實際上不是一個JSON數組。這是一個包含其他對象的對象。 –

+0

這就是爲什麼我把它標記爲PHP問題。爲了得到一個json數組,我的php數組應該是什麼樣子? – Dhouard

回答

3

看你的代碼,它看起來像你想的列表對象與nameurl(這實際上更有意義)。

更改PHP來匹配格式:

$channels = [ 
    'channels' => [ 
     [ 
      'name' => 'tele5', 
      'url' => 'http://mset-prod-1.live-delivery.ooyala.com/out/u/3vkkbgnvsm2r5/104951/RsZXlnNTE6re1fFuFEI0UrdA2Uj7pNGM/cn/5d62490854b545598f64eaa84709400b_4.m3u8' 
     ], 

     [ 
      'name' => 'divinity', 
      'url' => 'http://mset-prgb-2.live-delivery.ooyala.com/out/u/3vkkbgnvsm2r5/104951/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B/cn/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8' 
     ], 

     ... and so on 
    ] 
]; 

echo json_encode($channels); 

這將使你的JSON看起來像這樣:

{ 
    "channels":[ 
     { 
      "name": "tele5", 
      "url": "http:\/\/mset-prod-1.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/RsZXlnNTE6re1fFuFEI0UrdA2Uj7pNGM\/cn\/5d62490854b545598f64eaa84709400b_4.m3u8" 
     }, 
     { 
      "name": "divinity", 
      "url": "http:\/\/mset-prgb-2.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B\/cn\/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8" 
     }, 

     ... and so on 
    ] 
} 

正如其他人所指出的那樣,只要你有"key" => "value",它會不再是一個JSON數組,而是一個JSON對象。

+0

@YvesLeBorg - 啊,謝謝你的報價修復。 :-) –

+0

就是這樣。我前一段時間做了這段代碼,並忘記了我是如何做到的。非常感謝@YvesLeBorg – Dhouard

+0

@Dhouard如果解決了問題,請隨時接受答案,以便其他人知道問題已解決。 –

3

channelsJSONObject"channels":{...})不JSONOArray[]),以便

JSONObject channels = json.getJSONObject("channels"); 

更新:獲得JSON數組使用channel索引和array()功能

<?php 
    $channels['channels'] = array([ 
     'tele5' => 'http://mset-prod-1.live-delivery.ooyala.com/out/u/3vkkbgnvsm2r5/104951/RsZXlnNTE6re1fFuFEI0UrdA2Uj7pNGM/cn/5d62490854b545598f64eaa84709400b_4.m3u8', 
     'divinity' => 'http://mset-prgb-2.live-delivery.ooyala.com/out/u/3vkkbgnvsm2r5/104951/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B/cn/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8', 
     'bemad' => 'http://mset-prgb-2.live-delivery.ooyala.com/out/u/3vkkbgnvsm2r5/104951/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B/cn/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8', 
     'antena3' => 'http://a3live-lh.akamaihd.net/i/[email protected]/master.m3u8' 

]); 

echo json_encode($channels); 

和Java代碼應該是

JSONObject json = new JSONObject(response); 

channels = json.getJSONArray("channels"); 
for (int i = 0; i < channels.length(); i++) { 
    JSONObject channel = channels.getJSONObject(i); 
    String tele5 = channel.getString("tele5"); 
    String bemad = channel.getString("bemad"); 
    // use appropriate keys 
} 
+0

忘記說Channels是一個JSONArray,所以我需要getJSONArray。 – Dhouard

+0

@Dhouard有一點很奇怪,你的數據中沒有'name'和'url',你試圖在java中解析,所以它應該是'tele5'或者類似的鍵 –

2

JSONObject是由{...}包圍的東西。 JSONArray是由[....]包圍的東西。所以{"key": "value", "key2": "value2"}是2個鍵一個JSONObject而 [1, 2, 3] &

[{"key1" : "value1-1", "key2": "value2-1"}, 
{"key1": "value1-2", "key2": "value2-2"}, 
{"key3", "value3", "key4": "value4"}] 

的JSONArray。 第二個JSONArray非常有趣,說了很多。它是一個包含3個JSONObjects的數組。關鍵和價值可以遵循你喜歡的任何慣例。

您的腳本正在發送帶有「通道」鍵和另一個JSONObject值的JSONObject。 在java中,您正在從響應中正確解析通道對象。但是你試圖從不正確的渠道獲得JSONArray。

更新您的腳本輸出(注意[])

{ 
    "channels":[{ 
     "tele5":"http:\/\/mset-prod-1.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/RsZXlnNTE6re1fFuFEI0UrdA2Uj7pNGM\/cn\/5d62490854b545598f64eaa84709400b_4.m3u8", 
     "divinity":"http:\/\/mset-prgb-2.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B\/cn\/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8", 
     "bemad":"http:\/\/mset-prgb-2.live-delivery.ooyala.com\/out\/u\/3vkkbgnvsm2r5\/104951\/IybDNyYTE6j7PZaKerX9iKFSCuctjf5B\/cn\/95d3fccb2d6f4ad6b09d23e7c67d3acf_4.m3u8", 
     "antena3":"http:\/\/a3live-lh.akamaihd.net\/i\/[email protected]\/master.m3u8" 
    }] 
} 

或更新您的Java解析

JSONObject json = new JSONObject(response); 
channel = json.getJSONObject("channels"); 

// Whatever you want to do with this single channel (this is not an array) 
+1

如果你只是將'channel'包裝起來,內容在'[]'中,它不再是有效的json。在json數組中不能有key =>值,並且不能在沒有json對象中的鍵的情況下擁有數組。 –

+0

對不起。編輯過的文章 –

+2

儘管如此,您的編輯實際上並沒有幫助OP解決問題。您基本上只是通過將OP當前獲取的同一對象包裝到數組中來添加額外的級別。 –

0

這裏的「channels」是一個json對象而不是一個json數組。

可以執行以下操作:

的JSONObject channelsMap = json.getJSONObject( 「信道」);

然後迭代「channelsMap」。

對於在JSONObject的 「channelsMap」 每個條目:

  • 關鍵是頻道名稱

  • 值是頻道網址