![]()  | 
	
	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。 現在的時間是12:49 PM. | 
	vBulletin Version 3.0.1  
powered_by_vbulletin  2025。