JSON全面讲解
一、Json简介
概念:JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。
优点:
(1)本质就是具有特定格式的字符串
(2)JSON完全独立于编程语言
(3)JSON比XML数据传输的有效性要高出很多,更省流量
缺点:
语义性较差,不如XML直观
二、JSON数据格式
整体结构
(1) String json1 = “{“id” : “12”,”name” : “Tom”}”
(2)String json2 = “[{“id” : “12”,”name” : “Tom”},{“id” : “12”,”name” : “Tom”}]”
Json对象:{} -----类似于java中的map集合
(1)Json对象的结构:{key1:value1,key2:value2...}
(2)key的数据类型:字符串
(3)value的数据类型:数值、字符串、null、json数据[]、json对象{}、
Json数组:[] ----类似于java中list集合
(1)Json数组的结构:[value1,value2....]
(2)value的数据类型:数值、字符串、null、json数组[]、json对象{}
三、JSON解析方向
将java对象(包括集合)转换为json格式字符串----在服务端应用
将json格式的字符串转换为java对象(包含集合)----在客户端应用
Json和java之间的转换关系
(1)json对象对应javabean对象
(2)Json数组和java对象构成的list对应
四、JSON解析技术
Android原生技术
特点:编程相对麻烦
数据之间的转换
(1)将json格式的字符串{}转换为java对象
API:
JSONObject(json):将json字符串解析为json对象
Xxx.getXxx(String name) :根据name,在json对象中得到对应的Value
Xxx.optXxx(String name) :根据name,在json对象中得到对应的Value
Opt方法会在对应的key中的值不存在的时候返回一个空字符串或者返回你指定的默认值。
但是get方法会出现空指针异常的情况。
(2)将json格式的字符串[]转换为java对象的List
API:
JSONARRAY(String json):将json字符串解析为json数组
Int lenght :得到json数组中元素的个数
(3)复杂json数据解析
其实就是既有json字符串又有json数组
Google没有提供将java转换为json的方法。
Gson框架技术
特点:编码简洁,Google官方推荐
数据之间转换:
(1)将json格式的字符串{}转换为java对象
API:
<T> T fromJson(String json,Class<T> classofT)
注意:要求Json对象中的key的名称与java对象对应的类中的属性名要相同
步骤:
(a)将Gson的jar包导入的项目中
(b)创建Gson对象
Gson gson = new Gson();
(c)通过创建的Gson对象调用fromJson()方法,返回该Json数据对应的java对象
DataInfo dataInfo = gson.fromJson(json,DataInfo,class);
(2)将json格式的字符串[]转换为java对象的List
API:
fromJson(json,Type typeofT);
步骤:
(a)将Gson的jar包导入的项目中
(b)创建Gson对象
Gson gson = new Gson();
(c)通过创建的Gson对象调用fromJson()方法,返回该Json数据对应的java集合
List<DataInfo> infos = gson.fromJson(josn,new TypeToken<List<DataInfo>>(){}.getType());
(3)将java对象转换为json字符串{}
API:
String toJson(Object src);
步骤:
(a)将Gson的jar包导入的项目中
(b)创建Gson对象
Gson gson = new Gson();
(c)通过创建的Gson对象调用toJson()方法,返回该Json数据
DataInfo info = new DataInfo(1,”apple”,250.0,”eggs”);
String json = gson.toJson(info);
(4)将java对象的List转换为json字符串[]
API:
String toJson(Object src);
步骤:
(a)将Gson的jar包导入的项目中
(b)创建Gson对象
Gson gson = new Gson();
(c)通过创建的Gson对象调用toJson()方法,返回该Json数据
List<DataInfo> infoList = new ArrayList<>();
String json = gson.toJson(infoList);
FastJson技术
特点:FastJson是一个java语言编写的高性能功能完善的Json库,它采用一种“假定有序快速匹配”的算法,把Json解析的性能提升到极致,是目前java语言中最快的Josn库
数据间转换
(1)将json格式的字符串{}转换为java对象
API:
<T> T parseObject(String json,Class<T> classOfT);
步骤:
(a)将FastJson的jar包导入的项目中
(b)JSON调用parseObject()方法,获取转换后的java对象
DataInfo dataInfo = JSON.parseObject(json,DataInfo.class);
(2)将json格式的字符串[]转换为java对象的List
API:
List<T> parseArray(String json,Class<T> classOfT);
步骤:
(a)将FastJson的jar包导入的项目中
(b)JSON调用parseArray()方法,获取转换后的java集合
List<DataInfo> infoList = new ArrayList(json,DataInfo.class);
(3)将java对象转换为json字符串{}
API:
String toJSONString(Object object);
步骤:
(a)将FastJson的jar包导入的项目中
(b)JSON调用toJSONString()方法,获取转换后的json数据
DataInfo dataInfo = new DataInfo(1,”apple”,2,”eggs”);
String json = JSON.toJSONString(dataInfo);
(4)将java对象的List转换为json字符串[]
API:
String toJSONString(Object object);
步骤:
(a)将FastJson的jar包导入的项目中
(b)JSON调用toJSONString()方法,获取转换后的json数据
List<DataInfo> infoList = new ArrayList();
DataInfo zhangsan = new DataInfo(1,zhangsan);
DataInfo lisi = new DataInfo(2,lisi);
infoList.add(zhangsan);
infoList.add( lisi );
String json = JSON.toString(infoList);
最后说一下根据不同的json数据(获取到的json数据用HI JSON 进行格式化,就会很清晰json数据的结构),JavaBean类的编写原则:
(1)遇到{}就写一个类
(2)遇到[]就写一个集合一般写ArrayLsit
(3)什么符号都没有,就是基本数据类型
(4)尽量把javaBean对象定义广一些
(5)有的人说我不想写那个,太烦了,好吧,GsonFormat工具可以自动生成javaBean类
先看一个app展示:
再看一下工程目录:(使用的是MVP模式)
接下来直接上代码:
Model层:
public class DataInfo { /** * id : 1 * name : xue */ private String id; private String name; public DataInfo(String id, String name) { this.id = id; this.name = name; } public DataInfo() {} public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "DataInfo{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; } }
public interface IDataInfo { //提供数据的接口 DataInfo sendDataInfo(); }
public class IDataInfoImpl implements IDataInfo { @Override public DataInfo sendDataInfo() { DataInfo dataInfo = new DataInfo(); return dataInfo; } }
public class DataInfoComplex { @Override public String toString() { return "DataInfoComplex{" + "data=" + data + ", code='" + code + '\'' + ", msg='" + msg + '\'' + '}'; } /** * data : {"count":10,"items":[{"id":1,"title":"苹果"},{"id":2,"title":"香蕉"},{"id":3,"title":"葡萄"}]} * code : 1000 * msg : success */ private DataBean data; private String code; private String msg; public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public static class DataBean { @Override public String toString() { return "DataBean{" + "count=" + count + ", items=" + items + '}'; } /** * count : 10 * items : [{"id":1,"title":"苹果"},{"id":2,"title":"香蕉"},{"id":3,"title":"葡萄"}] */ private int count; private List<ItemsBean> items; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public List<ItemsBean> getItems() { return items; } public void setItems(List<ItemsBean> items) { this.items = items; } public static class ItemsBean { @Override public String toString() { return "ItemsBean{" + "id=" + id + ", title='" + title + '\'' + '}'; } /** * id : 1 * title : 苹果 */ private int id; private String title; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } } }
public interface IDataInfoComplex { DataInfoComplex sendDataInfo(); }
public class IDataInfoComplexImpl implements IDataInfoComplex { @Override public DataInfoComplex sendDataInfo() { DataInfoComplex dataInfoComplex = new DataInfoComplex(); return dataInfoComplex; } }
Presenter层:
public interface JsonObjectIPresenter { String deliverTurnedData(); //处理完数据需要返回给View String deliverOrignalData(); String deliverJsonListTurnedData(); String deliverJsonListOrignalData(); String deliverComplexJsonTurnedData(); String deliverComplexJsonOrignalData(); }
public class JsonObjectIPresenterImpl implements JsonObjectIPresenter { private JsonObjectIView mJsonObjectIView; private IDataInfoImpl mIDataInfoImpl = new IDataInfoImpl(); private String mName; private String mId; public JsonObjectIPresenterImpl(JsonObjectIView jsonObjectIView) { this.mJsonObjectIView = jsonObjectIView; } @Override public String deliverTurnedData() { DataInfo dataInfo = null; String json = mJsonObjectIView.getData(); try { JSONObject jsonObject = new JSONObject(json); mName = jsonObject.optString("name"); mId = jsonObject.optString("id"); //获取对象,并封装对象 dataInfo = mIDataInfoImpl.sendDataInfo(); dataInfo.setId(mId); dataInfo.setName(mName); } catch (JSONException e) { e.printStackTrace(); return null; } return dataInfo.toString(); } @Override public String deliverOrignalData() { String json = mJsonObjectIView.getData(); return json; } @Override public String deliverJsonListTurnedData() { List<DataInfo> list = new ArrayList<>(); DataInfo dataInfolist = null; String jsonListData = mJsonObjectIView.getJsonListData(); try { JSONArray jsonArray = new JSONArray(jsonListData); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); String id = jsonObject.optString("id"); String name = jsonObject.optString("name"); dataInfolist = mIDataInfoImpl.sendDataInfo(); dataInfolist.setId(id); dataInfolist.setName(name); list.add(dataInfolist); } } catch (JSONException e) { e.printStackTrace(); } return list.toString(); } @Override public String deliverJsonListOrignalData() { String jsonListData = mJsonObjectIView.getJsonListData(); return jsonListData; } @Override public String deliverComplexJsonTurnedData() { //获取需要解析的json数据 String complexJsonData = mJsonObjectIView.getComplexJsonData(); //获取DataInfoComplex对象,用来封装json数据 DataInfoComplex dataInfoComplex = new DataInfoComplex(); //解析json try { //第一层解析 JSONObject jsonObject = new JSONObject(complexJsonData); String code = jsonObject.optString("code"); JSONObject data = jsonObject.optJSONObject("data"); String msg = jsonObject.optString("msg"); //第一层数据封装 dataInfoComplex.setCode(code); //这里需要获取到data对应的对象 DataInfoComplex.DataBean dataBean = new DataInfoComplex.DataBean(); dataInfoComplex.setData(dataBean); dataInfoComplex.setMsg(msg); //第二层解析 int count = data.optInt("count"); JSONArray items = data.optJSONArray("items"); //第二层封装 dataBean.setCount(count); List<DataInfoComplex.DataBean.ItemsBean> itemsList = new ArrayList<>(); dataBean.setItems(itemsList); //第三层解析 for (int i = 0; i < items.length(); i++) { JSONObject jsonObject1 = items.optJSONObject(i); int id = jsonObject1.optInt("id"); String title = jsonObject1.optString("title"); //第三层数据封装 DataInfoComplex.DataBean.ItemsBean itemsBean = new DataInfoComplex.DataBean.ItemsBean(); itemsBean.setId(id); itemsBean.setTitle(title); } } catch (JSONException e) { e.printStackTrace(); } return dataInfoComplex.toString(); } @Override public String deliverComplexJsonOrignalData() { String complexJsonData = mJsonObjectIView.getComplexJsonData(); return complexJsonData; } }
public interface GsonIPresenter { String deliverTurnedData(); //处理完数据需要返回给View String deliverOrignalData(); String deliverJsonListTurnedData(); String deliverJsonListOrignalData(); }
public class GsonIPresenterImpl implements GsonIPresenter { private GsonIView mGsonIView; // private IDataInfoImpl mIDataInfoImpl = new IDataInfoImpl(); public GsonIPresenterImpl(GsonIView gsonIView) { this.mGsonIView = gsonIView; } //传递解析后数据的方法 @Override public String deliverTurnedData() { //获取json String jsonData = mGsonIView.getJsonData(); //解析json Gson gson = new Gson(); //直接将json字符串印射成一个对象 DataInfo dataInfo = gson.fromJson(jsonData, DataInfo.class); return dataInfo.toString(); } @Override public String deliverOrignalData() { //获取json String jsonData = mGsonIView.getJsonData(); return jsonData; } @Override public String deliverJsonListTurnedData() { //获取json数据 String jsonArrayData = mGsonIView.getJsonArrayData(); //解析json数组 Gson gson = new Gson(); List<DataInfo> dataInfo = gson.fromJson(jsonArrayData, new TypeToken<List<DataInfo>>() { }.getType()); return dataInfo.toString(); } @Override public String deliverJsonListOrignalData() { //获取json数据 String jsonArrayData = mGsonIView.getJsonArrayData(); return jsonArrayData; } }
public interface FastJsonIPresenter { String deliverTurnedData(); //处理完数据需要返回给View String deliverOrignalData(); String deliverJsonListTurnedData(); String deliverJsonListOrignalData(); }
public class FastJsonIPresenterImpl implements FastJsonIPresenter { private FastJsonIView mFastJsonIView; public FastJsonIPresenterImpl(FastJsonIView fastJsonIView) { this.mFastJsonIView = fastJsonIView; } @Override public String deliverTurnedData() { //获取json String jsonData = mFastJsonIView.getJsonData(); //解析json (就一句话搞定啊,感动哭了。。。) DataInfo dataInfo = JSON.parseObject(jsonData, DataInfo.class); return dataInfo.toString(); } @Override public String deliverOrignalData() { //获取json String jsonData = mFastJsonIView.getJsonData(); return jsonData; } @Override public String deliverJsonListTurnedData() { //获取json数组 String jsonArrayData = mFastJsonIView.getJsonArrayData(); //解析json数组 (还是一句话搞定啊,阿里粑粑厉害啊!) List<DataInfo> dataInfos = JSON.parseArray(jsonArrayData, DataInfo.class); return dataInfos.toString(); } @Override public String deliverJsonListOrignalData() { //获取json数组 String jsonArrayData = mFastJsonIView.getJsonArrayData(); return jsonArrayData; } }
View层:
public class BaseActivity extends AppCompatActivity { public void JumpToActivity (Class clazz) { Intent intent = new Intent(this,clazz); startActivity(intent); } }
public class MainActivity extends BaseActivity { @InjectView(R.id.btn_JsonObject) Button btnJsonObject; @InjectView(R.id.btn_Gson) Button btnGson; @InjectView(R.id.btn_FastJson) Button btnFastJson; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); } @OnClick({R.id.btn_JsonObject, R.id.btn_Gson, R.id.btn_FastJson}) public void onClick(View view) { switch (view.getId()) { case R.id.btn_JsonObject: JumpToActivity(JsonObjectActivity.class); break; case R.id.btn_Gson: JumpToActivity(GsonActivity.class); break; case R.id.btn_FastJson: JumpToActivity(FastJsonActivity.class); break; } } }
public interface JsonObjectIView { String getData(); String getJsonListData(); String getComplexJsonData(); }
public class JsonObjectActivity extends AppCompatActivity implements JsonObjectIView { @InjectView(R.id.btn_JsonToJavaObject) Button btnJsonToJavaObject; @InjectView(R.id.btn_JsonToJavaList) Button btnJsonToJavaList; @InjectView(R.id.btn_ComplexJsonToJavaObject) Button btnComplexJsonToJavaObject; @InjectView(R.id.tv_orginal) TextView tvOrginal; @InjectView(R.id.tv_parsed) TextView tvParsed; private JsonObjectIPresenter mJsonObjectIPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_json_object); ButterKnife.inject(this); mJsonObjectIPresenter = new JsonObjectIPresenterImpl(this); } @OnClick({R.id.btn_JsonToJavaObject, R.id.btn_JsonToJavaList, R.id.btn_ComplexJsonToJavaObject}) public void onClick(View view) { switch (view.getId()) { //将Json对象转换成Java对象 case R.id.btn_JsonToJavaObject: String orignalData = mJsonObjectIPresenter.deliverOrignalData(); tvOrginal.setText(orignalData); String turnedData = mJsonObjectIPresenter.deliverTurnedData(); tvParsed.setText(turnedData); break; //将Json对象转换成Java集合 case R.id.btn_JsonToJavaList: String deliverJsonListTurnedData = mJsonObjectIPresenter.deliverJsonListTurnedData(); tvParsed.setText(deliverJsonListTurnedData); String deliverJsonListOrigalData = mJsonObjectIPresenter.deliverJsonListOrignalData(); tvOrginal.setText(deliverJsonListOrigalData); break; //将一个同时包含有对象和数组的json数据转换成Java对象 case R.id.btn_ComplexJsonToJavaObject: String complexJsonTurnedData = mJsonObjectIPresenter.deliverComplexJsonTurnedData(); tvParsed.setText(complexJsonTurnedData); String complexJsonOrignalData = mJsonObjectIPresenter.deliverComplexJsonOrignalData(); tvOrginal.setText(complexJsonOrignalData); break; } } @Override public String getData() { String json = "{\"id\":\"1\",\"name\":\"xue\"}"; return json; } @Override public String getJsonListData() { String jsonList = "[{\"id\":\"1\",\"name\":\"xue\"},{\"id\":\"2\",\"name\":\"guo\"}]"; return jsonList; } @Override public String getComplexJsonData() { String complexJson = "{\"data\":{\"count\":10,\"items\":[{\"id\":1,\"title\":\"苹果\"}," + "{\"id\":2,\"title\":\"香蕉\"}," + "{\"id\":3,\"title\":\"葡萄\"}]},\"code\":\"1000\",\"msg\":\"success\"}"; return complexJson; } }
public interface GsonIView { String getJsonData(); String getJsonArrayData(); }
public class GsonActivity extends AppCompatActivity implements GsonIView{ @InjectView(R.id.btn_gson_toJavaObject) Button btnGsonToJavaObject; @InjectView(R.id.btn_gson_toJavaList) Button btnGsonToJavaList; @InjectView(R.id.tv_native_orignal) TextView tvNativeOrignal; @InjectView(R.id.tv_native_last) TextView tvNativeLast; private GsonIPresenter mGsonIPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gson); ButterKnife.inject(this); mGsonIPresenter = new GsonIPresenterImpl(this); } @OnClick({R.id.btn_gson_toJavaObject, R.id.btn_gson_toJavaList}) public void onClick(View view) { switch (view.getId()) { //将Json字符串转换成Java对象 case R.id.btn_gson_toJavaObject: String turnedData = mGsonIPresenter.deliverTurnedData(); tvNativeLast.setText(turnedData); String orignalData = mGsonIPresenter.deliverOrignalData(); tvNativeOrignal.setText(orignalData); break; //将Json数组转换成Java对象的集合 case R.id.btn_gson_toJavaList: String listTurnedData = mGsonIPresenter.deliverJsonListTurnedData(); tvNativeLast.setText(listTurnedData); String listOrignalData = mGsonIPresenter.deliverJsonListOrignalData(); tvNativeOrignal.setText(listOrignalData); break; } } @Override public String getJsonData() { String json = "{\"id\":\"1\",\"name\":\"xue\"}"; return json; } @Override public String getJsonArrayData() { String json = "[{\"id\":\"1\",\"name\":\"xue\"}," + "{\"id\":\"2\",\"name\":\"guo\"}]"; return json; } }
public interface FastJsonIView { String getJsonData(); String getJsonArrayData(); }
public class FastJsonActivity extends AppCompatActivity implements FastJsonIView { @InjectView(R.id.btn_fastJson_toJavaObject) Button btnFastJsonToJavaObject; @InjectView(R.id.btn_fastJson_toJavaList) Button btnFastJsonToJavaList; @InjectView(R.id.tv_orignal) TextView tvOrignal; @InjectView(R.id.tv_turned) TextView tvTurned; private FastJsonIPresenter mFastJsonIPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fast_json); ButterKnife.inject(this); mFastJsonIPresenter = new FastJsonIPresenterImpl(this); } @OnClick({R.id.btn_fastJson_toJavaObject, R.id.btn_fastJson_toJavaList}) public void onClick(View view) { switch (view.getId()) { //将json字符串转换为Java对象 case R.id.btn_fastJson_toJavaObject: String turnedData = mFastJsonIPresenter.deliverTurnedData(); tvTurned.setText(turnedData); String orignalData = mFastJsonIPresenter.deliverOrignalData(); tvOrignal.setText(orignalData); break; //将json数组转换为Java对象的集合 case R.id.btn_fastJson_toJavaList: String listTurnedData = mFastJsonIPresenter.deliverJsonListTurnedData(); tvTurned.setText(listTurnedData); String listOrignalData = mFastJsonIPresenter.deliverJsonListOrignalData(); tvOrignal.setText(listOrignalData); break; } } @Override public String getJsonData() { String json = "{\"id\":\"1\",\"name\":\"xue\"}"; return json; } @Override public String getJsonArrayData() { String json = "[{\"id\":\"1\",\"name\":\"xue\"}," + "{\"id\":\"2\",\"name\":\"guo\"}]"; return json; } }累死我了,写了三个小时,一动不动。。。