![]() |
PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 七嘴八舌異言堂
(https://www.pcdvd.com.tw/forumdisplay.php?f=12)
- - [JSON 格式]JSON的parsing
(https://www.pcdvd.com.tw/showthread.php?t=1051951)
|
---|
[JSON 格式]JSON的parsing
請問一下 這個JSON格式該如何parsing?
本來的JSON是這樣 代碼:
{"data":[{"no":2,"tag":"GroupList","value":"{\"TimeStamp\":\"1402915819\",\"GroupList\":[{\"Name\":\"hhgggb\",\"Device\":\"wowowow\",\"BGColor\":\"#ffba00\",\"Image\":{\"Size\":0,\"Local\":\"0\",\"Path\":\"\\\/data\\\/data\\\/com.wowow.love\\\/My_Group_Icon\\\/GroupIcon.jpg\"}}]}"}]} 我用這樣parsing 但是目前json改成這個格式 代碼:
JSONObject row; JSONObject Group0,Group1,Group3,Group4; JSONArray Group2; String [] Group5; String imageb; try { /////////// // if (array.getJSONObject(i).getJSONObject("tag").equals("Image_31")) { // imageb = array.getJSONObject(i).toString(); // } // else { /////////// Group0 = array.getJSONObject(i); mydlinkgroupinfostate = true; Group1 = new JSONObject(Group0.get("value").toString()); // Log.d(mt, "Process mydlink Group value string info use JSONObject = "+Group1.toString()); Group2 = new JSONArray(Group1.get("GroupList").toString()); ArrayList<mydlinkGroup> mydlinkGroup = new ArrayList<mydlinkGroup>(); for (int j = 0; j < Group2.length(); j++) { Group3=Group2.getJSONObject(j); mydlinkGroup mydlinkGroupinfo = new mydlinkGroup(); mydlinkGroupinfo.mGroupName=Group3.get("Name").toString(); Group4=Group3.getJSONObject("Image"); mydlinkGroupinfo.mLocal = Group4.get("Local").toString();;////Image @local if(mydlinkGroupinfo.mLocal.toString().equals("0")) { mydlinkGroupinfo.icon_path= Group4.get("Path").toString(); mydlinkGroupinfo.icon_type = ""; } else { mydlinkGroupinfo.icon_type = Group4.get("Path").toString(); mydlinkGroupinfo.icon_path = ""; } 我該如何parsing ? 因為其中一個valuse是整個string 而非是還可以再轉JSON的string 代碼:
[{"value":"{\"TimeStamp\":\"1402915819\",\"GroupList\":[{\"Name\":\"hhgggb\",\"Device\":\"wowowowo\",\"BGColor\":\"#ffba00\",\"Image\":{\"Size\":0,\"Local\":\"0\",\"Path\":\"\\\/data\\\/data\\\/com.wow.love\\\/My_Group_Icon\\\/GroupIcon.jpg\"}}]}","no":2,"tag":"GroupList"},{"value":"5555555edfqwefqwefrqwe3t","no":31,"tag":"Image_31"}] 謝謝 |
看錯------ delete
|
以 PHP 來說可以啊
代碼:
Array ( [data] => Array ( [0] => Array ( [no] => 2 [tag] => GroupList [value] => {"TimeStamp":"1402915819","GroupList":[{"Name":"hhgggb","Device":"wowowow","BGColor":"#ffba00","Image":{"Size":0,"Local":"0","Path":"\/data\/data\/com.wowow.love\/My_Group_Icon\/GroupIcon.jpg"}}]} ) ) ) Array ( [TimeStamp] => 1402915819 [GroupList] => Array ( [0] => Array ( [Name] => hhgggb [Device] => wowowow [BGColor] => #ffba00 [Image] => Array ( [Size] => 0 [Local] => 0 [Path] => /data/data/com.wowow.love/My_Group_Icon/GroupIcon.jpg ) ) ) ) 代碼:
$JSON = '{"data":[{"no":2,"tag":"GroupList","value":"{\"TimeStamp\":\"1402915819\",\"GroupList\":[{\"Name\":\"hhgggb\",\"Device\":\"wowowow\",\"BGColor\":\"#ffba00\",\"Image\":{\"Size\":0,\"Local\":\"0\",\"Path\":\"\\\/data\\\/data\\\/com.wowow.love\\\/My_Group_Icon\\\/GroupIcon.jpg\"}}]}"}]}'; $JSON_TO_ARRAY = json_decode($JSON, true); $_JSON_TO_ARRAY = json_decode($JSON_TO_ARRAY['data'][0]['value'], true); echo '<pre>'; print_r($JSON_TO_ARRAY); print_r($_JSON_TO_ARRAY); echo '</pre>'; |
value 那字串看起來就很像json格式。
有沒有可能是\"TimeStamp\" 的斜線\造成無法辨識。 把這些斜線\去掉試試。 很久沒看json了,以上是不負責亂猜的 :laugh: |
如果"value"的值是string, parser可能就無法處理, 大概就只能用substring一個一個自己拆了.
|
不是很懂您要的是什麼?如果是取出來是json format的string以下code能達到
@Test public void testJson() { String json = "{\"data\":[{\"no\":2,\"tag\":\"GroupList\",\"value\":\"{\\\"TimeStamp\\\":\\\"1402915819\\\",\\\"GroupList\\\":[{\\\"Name\\\":\\\"hhgggb\\\",\\\"Device\\\":\\\"wowowow\\\",\\\"BGColor\\\":\\\"#ffba00\\\",\\\"Image\\\":{\\\"Size\\\":0,\\\"Local\\\":\\\"0\\\",\\\"Path\\\":\\\"\\\\/data\\\\/data\\\\/com.wowow.love\\\\/My_Group_Icon\\\\/GroupIcon.jpg\\\"}}]}\"}]}"; JSONObject jsonObj = JSONObject.fromObject(json); System.out.println(jsonObj.getJSONArray("data").getJSONObject(0).getString("value")); } 此時用 jsonObj.getJSONArray("data").getJSONObject(0).getString("value") 是String, 如果是用jsonObj.getJSONArray("data").getJSONObject(0).get("value")則為JSONObject 如果您要印出來value的值跟 => {\"TimeStamp\":\"1402915819\",\"GroupList\":[{\"Name\":\"hhgggb\",\"Device\":\"wowowow\",\"BGColor\":\"#ffba00\",\"Image\":{\"Size\":0,\"Local\":\"0\",\"Path\":\"\\\/data\\\/data\\\/com.wowow.love\\\/My_Group_Icon\\\/GroupIcon.jpg\"}}]} 完全一模一樣的話, 請多加點反斜線即可 |
這個parsing很麻煩的地方在於
SPEC規範的格式 因為小氣 有的value內放了 可以轉json的string (例如GroupList) 要用JSONArray把這種string接入 然後會自己處理成JSONObject 可是又有的value是一般單純的 所以很麻煩 請問該如何設下判斷條件 謝謝 |
JSONObject jsonObj = JSONObject.fromObject(json);
Object obj = jsonObj.getJSONArray("data").getJSONObject(0).get("value"); if(obj instanceof JSONObject || obj instanceof JSONArray) { System.out.println("json format string"); } else{ System.out.println("not json format string"); } |
|
前陣子寫聊天室來玩,有小玩一下
我是用Gson搭配跟訊息的類別,不過屬性一多,還是會很不好設計該類別拉... :D -- while (socket.isConnected()) { // 取得網路串流的訊息 String msg = br.readLine(); System.out.println(msg); //JSON格式的字串,要重新編譯後廣播出去,Json格式 jsonMsg(msg); } public static void jsonMsg(String Msg) { try { // 創造網路輸出串流 BufferedWriter bw; bw = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream())); Gson gson = new Gson(); Message message = gson.fromJson(Msg, Message.class); // 寫入訊息到串流 bw.write(message.getName() + ":" + message.getMsg() + "\t\t" + message.getTime() + "\n"); } catch (IOException e) { } } } ---- 我把GSON轉成字串指定UTF8格式後,我在利用GSON轉換成我Message類別的屬性 這樣寫應該可以少寫很多if else了吧∼ --- Message message = gson.fromJson(Msg, Message.class); 不過應該也可以這樣寫~ Message message = (new Gson()).fromJson(Msg, Message.class); --- 指定轉換成我要的類別~好用在這一行,哈...當參考用吧 |
所有的時間均為GMT +8。 現在的時間是03:25 PM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。