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