一、第一种方法用Android原生技术JSON来解析
1、什么是json
json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。
json一共有两种数据结构,一种是以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
2、JsonObject
JsonObject是解析单组数据对象的API,解析数据要创建对应的JavaBean,注意Key要与解析时候的对应,下面直接上代码:
JavaBean:
package com.zero.cui.jsondemo;
/**
* Created by y on 2018/5/7.
*/
public class TestInfo {
private int id;
private String name;
private double height;
private String imagePath;
@Override
public String toString() {
return "TestInfo{" +
"id=" + id +
", name='" + name + '\'' +
", height=" + height +
", imagePath='" + imagePath + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getImagePath() {
return imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
public TestInfo(int id, String name, double height, String imagePath) {
super();
this.id = id;
this.name = name;
this.height = height;
this.imagePath = imagePath;
}
}
MainActivity:
package com.zero.cui.jsondemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
//第一种方法用Android原生技术JSON来解析
//为了方便不去写json表,直接创建一个数据。
String json = "{\n" +
"\t\"id\":1, \"name\":\"帅龙\", \n" +
"\t\"height\":175, \n" +
"\t\"imagePath\":\"https://b-ssl.duitang.com/uploads/item/201511/26/20151126112617_vUaQf.jpeg\"\n" +
"}\n";
TestInfo testInfo = null;
private TextView tv_native_last;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_native_last = (TextView) findViewById(R.id.tv_native_last);
try {
// 获取JSONObject实例
JSONObject jsonObject = new JSONObject(json);
int id = jsonObject.optInt("id");
String name = jsonObject.optString("name");
double height = jsonObject.optDouble("height");
String imagePath = jsonObject.optString("imagePath");
// 封装java对象
testInfo = new TestInfo(id,name,height,imagePath);
Log.e("<<<",testInfo+"");
} catch (JSONException e) {
e.printStackTrace();
}
// 显示到文本框里
tv_native_last.setText(testInfo.toString());
}
}
3、 JSONArray
JsonArray是一个解析Json数组的API,int length();得到json数组中元素的个数;
JSONObject jsonObject = jsonArray.getJSONObject(i); 然后去拿一行单个的,包括复杂特殊的json数据怎样去解析,也是大同小异了,一层一层解析就行,下面上代码:
package com.zero.cui.jsondemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { //第一种方法用Android原生技术JSON来解析 //为了方便不去写json表,直接创建一个数据。 String json = "[\n" + " {\n" + " \"id\": 1,\n" + " \"imagePath\": \"https://b-ssl.duitang.com/uploads/item/201511/26/20151126112617_vUaQf1.jpeg\",\n" + " \"name\": \"帅\",\n" + " \"height\": 175\n" + " },\n" + " {\n" + " \"id\": 2,\n" + " \"imagePath\": \"https://b-ssl.duitang.com/uploads/item/201511/26/20151126112617_vUaQf2.jpeg\",\n" + " \"name\": \"龙\",\n" + " \"height\": 176\n" + " }\n" + "]"; private ArrayList<TestInfo> list; private TextView tv_native_last; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_native_last = (TextView) findViewById(R.id.tv_native_last); list = new ArrayList<>(); try { JSONArray jsonArray = new JSONArray(json); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); if (jsonObject != null) { int id = jsonObject.optInt("id"); String name = jsonObject.optString("name"); double height = jsonObject.optDouble("height"); String imagePath = jsonObject.optString("imagePath"); //封装java对象 TestInfo testInfo = new TestInfo(id, name, height, imagePath); list.add(testInfo); Log.e("<<<", list + ""); } } } catch (JSONException e) { e.printStackTrace(); } // 显示到文本框里 tv_native_last.setText(list.toString()); } }
二、用Gson框架技术解析JSON:
先说一下Gson的特点 :解析没那么麻烦,代码量简洁,可以很方便地解析复杂的Json数据,而且谷歌官方也推荐使用。
如果要使用Gson来解析,首先要导入Gson的jar包。
jar包的下载路劲:https://mvnrepository.com/artifact/com.google.code.gson/gson
1、将gson的jar包导入到项目libs目录下,或者直接通过Gradle添加依赖:
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
2、创建Gson对象:
Gson gson = new Gson();
3、通过创建的Gson对象调用fromJson()方法,返回该json数据对象的Java对象;
TestInfo textInfo = gson.fromJson(json, DemoInfo.class);
Gson还可以将Java对象、Java对象的List 转换为json字符串{};
注意事项:记得创建对象的JavaBean类;要求json对象中的key的名称与Java对象的JavaBean类中的属性名要相同,否则解析不成功!
三、用Fastjson框架技术解析JSON:
1、用法跟Gson的用法步骤基本一样,导入Jar包 或者加入依赖:
compile 'com.alibaba:fastjson:1.1.55.android'
2、利用Fastjson的JSON调用parseObject()方法,获取转换后的Java对象。
TestInfo textInfo = JSON.parseObject(json, ShopInfo.class);
特点:Fastjson是用Java语言编写的高性能功能完善的JSON库。
它采用了一种“假定有序、快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。
Fastjson是阿里巴巴开源框架,已经开源到github上了,地址为:https://github.com/alibaba/fastjson