使用Gson解析json数据,并分类数据
自带的Json解析真的不好用,碰上大规模的json数据就不行了。
比如:
服务器返回的Json看起来就是不爽,用这个吧 就不告诉你
想法
一个API接口返回很多数据,而不同的数据之间有共同性,把有共同之处组合起来放在一起,以备不时之需。
思路
实现
1.首先要有一个自定义的线程来去访问网络,获取到json。
mInternetThread
public class MInternetThread extends Thread {
private String finalUrl;
public Handler handler;
public int what;
String content;
ArrayList<String> list;
public MInternetThread(Handler handler, int what, String finalUrl) {
this.handler = handler;
this.what = what;
this.finalUrl = finalUrl;
}
public ArrayList<String> initString(String reString) {
return new ArrayList<String>();
}
public void getInfo() {
try {
URL url = new URL(finalUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream inputStream = connection.getInputStream();
byte[] data = new byte[10240];
int len = 0;
StringBuffer stringBuffer = new StringBuffer();
while ((len = inputStream.read(data)) != -1) {
content = new String(data, 0, len);
stringBuffer.append(content);
list = initString(content);
}
connection.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
getInfo();
Message message = new Message();
message.what = what;
message.obj = list;
handler.sendMessage(message);
}
}
这其中,包含了获取json和handler以及初始化json的方法。初始化json就是把json中具有共性的部分区分开来。
FirstActivity
public class FifstActivity extends Activity {
class client extends MInternetThread {
public client(Handler handler, int what, String finalUrl) {
super(handler, what, finalUrl);
}
@Override
public ArrayList<String> initString(String reString) {
URLData data = new URLData();
Gson gson = new Gson();
ArrayList<String> list = new ArrayList<String>();
Log.e("解析前", reString);
data = gson.fromJson(reString, URLData.class);
Log.e("解析后", "" + data);
for (int i = 0; i < 10; i++) {
list.add(i, data.results.get(i).url.toString());
}
return list;
}
}
Handler handler = new Handler() {
public void dispatchMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
Log.e("handle message", "" + msg.obj);
break;
case 2:
break;
}
}
;
};
public String finalUrl = "http://gank.io/api/data/%E7%A6%8F%E5%88%A9/10/1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fifst);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new client(handler, 1, finalUrl).start();
}
});
}
}
所谓把数据分类就那么几行代码。
for (int i = 0; i < 10; i++) {
list.add(i, data.results.get(i).url.toString());
}
因为json里只有10个url,所以只循环10次。
使用Gson解析json 的数据类 URLData
public class URLData {
public String error="";
List<Child> results;
public static class Child{
public String _id="";
public String createdAt="";
public String desc="";
public String publishedAt="";
public String source="";
public String type="";
public String url="";
public String used="";
public String who="";
}
}
注意
- json数据读取的时候可能因为json数据太长,byte数组1024相对来讲比较小。
- gson数据类的书写格式一定要对照好
- 别忘记加网络访问权限
tip
gson数据类见到 { } 就新建个类,见到 [ ] 就新建一个List。