總結了一番,感覺是要将json轉換成javabean對象
1.Actor-user Demo
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn50MVpmT1kEVPpHOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLycDO2EDNygTM4AjNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
畫紅圈的地方是我在采用第三種方式時遇到的一個問題,這個地方報了錯:
Cannot resolve constructor 'JSONObject(com.example.gsontest.Actor)'
錯誤: 對于JSONObject(Actor), 找不到合适的構造器 構造器 ...
目前不知道怎麼解決QAQ
是以幹脆換了Gson來生成json
我把部落客的小demo改了一哈,順便模拟了一下伺服器傳回資料之後,怎麼從線程裡傳到主線程
import java.util.List;
public class Actor {
private String name;
private List<Fans> fans;
public Actor(){}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public List<Fans> getFans(){
return this.fans;
}
public void setFans(List<Fans> fans){
this.fans = fans;
}
}
package com.example.gsontest;
public class Fans {
private String name;
private int age;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return this.age;
}
public void setAge(int age){
this.age = age;
}
}
package com.example.gsontest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private final int LIST_INFO = 1;
private String name = "";
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case LIST_INFO:
String res = msg.obj.toString();
name = beanParse(res);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
beanCreatejson();
initData();
Log.d("fan0 name", name);
}
public void initData(){
new Thread(){
public void run(){
//由于沒有寫伺服器端的,直接用了原部落客的例子,就沒有寫上請求連接配接等等等的東東
String jsonString = "{\"fans\":[{\"name\":\"小王\",\"age\":7},"+
"{\"name\":\"小尼瑪\",\"age\":10}],\"name\":\"王尼瑪\"}";
Message message = Message.obtain();
message.what = LIST_INFO;
message.obj = jsonString;
handler.sendMessage(message);
}
}.start();
// beanParse(jsonString);
}
public void beanCreatejson(){
Actor actor = new Actor();
actor.setName("王尼瑪");
Fans fan1 = new Fans();
fan1.setName("小明");
fan1.setAge(10);
Fans fan2 = new Fans();
fan2.setName("小時");
fan2.setAge(12);
List<Fans> fans = new ArrayList<>();
fans.add(fan1);
fans.add(fan2);
actor.setFans(fans);
Gson gson = new Gson();
System.out.println("java bean建立json對象:" + gson.toJson(actor));
}
public String beanParse(String jsonStr){
JsonObject obj = new JsonParser().parse(jsonStr).getAsJsonObject();
// {"fans":[{"name":"小王","age":7},{"name":"小尼瑪","age":10}],"name":"王尼瑪"}
Actor actor = new Gson().fromJson(obj, Actor.class);
System.out.println("name" + obj.get("name"));
/* System.out.print("fans\n");
for(Fans fans: actor.getFans())
System.out.println("name "+ fans.getName() + ",age " + fans.getAge());*/
List<Fans> fan = actor.getFans();
return fan.get(0).getName();
}
}
2.json數組資料還能怎麼解析哇QAQ
這位部落客用栗子講明了當我們拿到伺服器那邊傳回的超長json,但有時候可能隻要一部分的數組,這時候怎麼搞,當然是掐住要害啦
比如我拿到了這樣子的稍微長一點的json
String jsonStr = "{\"albumModel\":[{\"albumId\":1,\"name\":\"第一歌單\",\"picture\":\"c1_s.jpg\"},{\"albumId\":2,\"name\":\"第二歌單\",\"picture\":\"c2_s.jpg\"},{\"albumId\":3,\"name\":\"第三歌單\",\"picture\":\"c3_s.jpg\"}],\"msg\":\"success\"}";
我現在想要的是将albumModel數組解析出來;
這時候我們可以這樣子
public void beanParase(String jsonStr){
JsonObject obj = new JsonParser().parse(jsonStr).getAsJsonObject();
JsonArray array = obj.getAsJsonArray("albumModel");
List<AlbumModel> list= new ArrayList<>();
for(JsonElement album: array){
AlbumModel albumModel = new Gson().fromJson(album, new TypeToken<AlbumModel>() {}.getType());
list.add(albumModel);
}
}
AlbumModel類
package com.example.musicmain.models;
import java.util.List;
public class AlbumModel {
private int albumId;
private String name;
private String picture;
/* private int playNum;
private List<MusicModel> list;*/
public int getAlbumId(){
return this.albumId;
}
public void setAlbumId(int albumId){
this.albumId = albumId;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public void setPicture(String picture){
this.picture = picture;
}
public String getPicture(){
return this.picture;
}
}
如果是沒有數組頭的話,參考部落客的說明,對萌新超級有用^v^