PCDVD數位科技討論區

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)

公不 2014-06-16 07:53 PM

[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"}]


謝謝

T磨人 2014-06-16 07:58 PM

看錯------ delete

PAN_PAN 2014-06-16 08:15 PM

以 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>';

blin1115 2014-06-16 08:34 PM

value 那字串看起來就很像json格式。
有沒有可能是\"TimeStamp\" 的斜線\造成無法辨識。
把這些斜線\去掉試試。
很久沒看json了,以上是不負責亂猜的 :laugh:

dino750 2014-06-16 10:59 PM

如果"value"的值是string, parser可能就無法處理, 大概就只能用substring一個一個自己拆了.

smallwall 2014-06-16 11:16 PM

不是很懂您要的是什麼?如果是取出來是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\"}}]}
完全一模一樣的話, 請多加點反斜線即可

公不 2014-06-16 11:31 PM

這個parsing很麻煩的地方在於

SPEC規範的格式

因為小氣

有的value內放了

可以轉json的string (例如GroupList)

要用JSONArray把這種string接入

然後會自己處理成JSONObject

可是又有的value是一般單純的

所以很麻煩

請問該如何設下判斷條件

謝謝

smallwall 2014-06-16 11:44 PM

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");
}

smallwall 2014-06-16 11:59 PM

另外要把json的string轉成特定的object可以用
https://code.google.com/p/google-gson/
前提是您使用的是java

u8u8u8u8 2014-06-17 10:33 AM

前陣子寫聊天室來玩,有小玩一下
我是用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。