总结了一番,感觉是要将json转换成javabean对象
画红圈的地方是我在采用第三种方式时遇到的一个问题,这个地方报了错:
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();
}
}
这位博主用栗子讲明了当我们拿到服务器那边返回的超长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^