参考资料:介绍 Json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。 JSON建构于两种结构: a、“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 b、值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
1、结构a——对象
- 对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
2、结构b——数组
- 数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
3、详解
- 值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。
- 字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串(string)与C或者Java的字符串非常相似。 quotation mark:引号 reverse solidus:反斜线 solidus:斜线 backspace:退格 formfeed:换页 newline:换行 carriage return:回车 horizontal tab:制表符 4 hexadecimal digits:4个16进制数 以上字符加了一个反斜杠后,表示冒号后的意思。
- 数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
二、如何快速拼装Json数据
假设我们的目标数据为:
{
"limit": 3,
"offset": 0,
"query": {
"_id": {
"$in": ["轮播位id1", "轮播位id2", "轮播位id3"]
}
}
}
- 大的{}是一个Json对象,所以我们创建一个json对象,limit和offset是属于json对象的最简单的键值对,所以直接用json.put()方法添加就好,query这个key对应着{},说明后面是一个对象,所以我们创建一个Json子对象subJson1,id这个key对应的也是{},也是一个对象,所以再创建一个子对象subJson2,$in对应的是[],是一个json数组,所以我们创建一个jsonArray 对象,然后将数据添加到jsonArray 数组里,接着将jsonArray 添加到subJson2里,接着将subJson2添加到subJson1里,最后将subJson1添加到json里。
JSONObject json = new JSONObject();
JSONObject subJson1 = new JSONObject();
JSONObject subJson2 = new JSONObject();
JSONArray jsonArray = new JSONArray();
json.put("limit",carrouselIdList.size());
json.put("offset",0);
for(int i=0;i<carrouselIdList.size();i++){
jsonArray.put(i,carrouselIdList.get(i));
}
subJson2.put("$in",jsonArray);
subJson1.put("_id",subJson2);
json.put("query",subJson1);
String data = json.toString();
三、如何快速解析Json数据
1、添加gson库依赖(需要的可以留言)
build.gradle
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
}
2、写一个Json类
public abstract class Json {
private static Json json;
Json() {
}
public static Json get() {
if (json == null) {
json = new GsonImplHelp();
}
return json;
}
public abstract String toJson(Object src);
public abstract <T> T toObject(String json, Class<T> claxx);
public abstract <T> T toObject(byte[] bytes, Class<T> claxx);
public abstract <T> List<T> toList(String json, Class<T> claxx);
}
3、写一个GsonImplHelp类
public class GsonImplHelp extends Json {
private Gson gson = new Gson();
@Override
public String toJson(Object src) {
return gson.toJson(src);
}
@Override
public <T> T toObject(String json, Class<T> claxx) {
return gson.fromJson(json, claxx);
}
@Override
public <T> T toObject(byte[] bytes, Class<T> claxx) {
return gson.fromJson(new String(bytes), claxx);
}
@Override
public <T> List<T> toList(String json, Class<T> claxx) {
Type type = new TypeToken<ArrayList<T>>() {
}.getType();
List<T> list = gson.fromJson(json, type);
return list;
}
}
4、使用插件快速生成解析实体Bean类
- 不知道的朋友查看我这篇博客:[Android]【安卓】使用插件快速生成JSon解析类
5、在请求回调中这么处理,就可以得到想要的数据
DataParseBean bean = GsonImplHelp.get().toObject(result, DataParseBean.class);